/* Core identity */
<<set $playerName to "">>
<<set $playerPath to "white">>
<<set $skipMinigames to false>>
<<set $patreonInitiationUnlocked to false>>
<<set $gameStarted to false>>
<<set $gameVersion to "0.2">>
<<set $versionEndSeen to false>>
<<set $versionEndReady to false>>
/* Performance stats */
<<set $statFocus to 1>>
<<set $statTechnique to 1>>
<<set $statStamina to 1>>
/* Economy */
<<set $money to 0>>
<<set $debt to 0>>
<<set $debtWeekly to 1500>>
<<set $debtDaysLeft to 7>>
<<set $debtActive to false>>
<<set $debtFailCount to 0>>
/* Calendar / actions */
<<set $dayOfWeek to 1>>
<<set $weekNumber to 1>>
<<set $actionsLeft to 3>>
<<set $actionsMax to 3>>
<<set $actionsUsedToday to 0>>
<<set $didRecoveryToday to false>>
/* Exhaustion / mood (0–10) */
<<set $exhaustion to 0>>
<<set $exhaustionMax to 5>>
<<set $exhaustionLocked to false>>
<<set $exhaustionLockDays to 0>>
<<set $mood to 4>>
<<set $moodMax to 5>>
/* Career flags */
<<set $careerStarted to false>>
<<set $systemsUnlocked to false>>
<<set $overallStudioRep to 0>>
<<set $escortRep to 0>>
<<set $camRep to 0>>
/* Unlock flags */
<<set $unlockedGloryholeSecrets to false>>
<<set $unlockedGloryholeInitiation to false>>
<<set $unlockedDogfart to false>>
<<set $unlockedVixen to false>>
<<set $unlockedBang to false>>
<<set $unlockedBrazzers to false>>
<<set $unlockedDeeper to false>>
<<set $unlockedCuckoldEscort to false>>
<<set $camUnlocked to true>>
<<set $onlyfansUnlocked to false>>
/* Career calendar (increments on sleep after systems unlock) */
<<set $careerDay to 0>>
<<set $storyDay3Done to false>>
<<set $storyDay5Done to false>>
<<set $storyDay7Done to false>>
<<set $storyDay8Done to false>>
<<set $storyDay9Done to false>>
<<set $storyDay10Done to false>>
<<set $storyDay11Done to false>>
<<set $forcedMorning to "">>
<<set $husbandMeetPending to false>>
<<set $husbandMeetDone to false>>
/* Scene progress */
<<set $sceneCompleted to {}>>
<<set $swallowIndex to 0>>
<<set $initiationIndex to 0>>
<<set $secretsIndex to 0>>
<<set $escortIndex to 0>>
<<set $camIndex to 0>>
<<set $studioSameDayLock to false>>
<<set $studioSameDayLock to false>>
<<set $swallowSameDayLock to false>>
<<set $initiationSameDayLock to false>>
<<set $secretsSameDayLock to false>>
<<set $escortSameDayLock to false>>
<<set $camSameDayLock to false>>
<<set $gloryholeSwallowCount to 0>>
<<set $gloryholeSecretsCount to 0>>
/* Experience counters */
<<set $expGloryhole to 0>>
<<set $expGangbang to 0>>
<<set $expOrgy to 0>>
<<set $expThreesome to 0>>
<<set $expCuckold to 0>>
<<set $expRough to 0>>
<<set $expBDSM to 0>>
/* Relations */
<<set $actressRelation to {
"rebel_rhyder": 0, "kira_noir": 0, "tommy_king": 0, "ella_knox": 0,
"lauren_phillips": 0, "cory_chase": 0, "violet_myers": 0,
"catherine": 0, "luna_lovesit": 0
}>>
<<set $studioRelation to {
"joy_media": 20, "dogfart": 0, "deeper": 0, "mofos": 0,
"nubiles": 0, "brazzers": 0, "vixen": 0, "bang": 0
}>>
/* Phone / messages */
<<set $messages to []>>
<<set $chats to []>>
<<set $unreadMessages to 0>>
<<set $unreadChats to 0>>
<<set $pendingRebeccaVisit to false>>
<<set $pendingRebelMeet to 0>>
<<set $rebelVisit1Ready to false>>
<<set $rebelVisit2Ready to false>>
<<set $rebelVisit1Done to false>>
<<set $rebelVisit2Done to false>>
<<set $rebelPrivateReady to false>>
<<set $kiraVouchReady to false>>
/* story beats use $careerDay / $forcedMorning / $husbandMeetPending */
/* City */
<<set $cityStars to []>>
/* Minigame state */
<<set $mg_Returning to false>>
<<set $mg_Score to 0>>
<<set $mg_Difficulty to 1>>
<<set $mg_BgVideo to "">>
<<set $mg_ReturnPassage to "">>
<<set $mg_Type to "">>
<<set $mg_UsePhase to false>>
<<set $lastScore to 0>>
<<set $trainTotalScore to 0>>
<<set $finalTrainScore to 0>>
<<set $videoSoundOn to false>><<widget "ensureVars">>
<<if ndef $playerPath>><<set $playerPath to "white">><</if>>
<<if ndef $skipMinigames>><<set $skipMinigames to false>><</if>>
<<if ndef $patreonInitiationUnlocked>><<set $patreonInitiationUnlocked to false>><</if>>
<<if ndef $money>><<set $money to 0>><</if>>
<<if ndef $debt>><<set $debt to 0>><</if>>
<<if ndef $debtWeekly>><<set $debtWeekly to 1500>><</if>>
<<if ndef $cityStars or !$cityStars>>
<<set $cityStars to []>>
<</if>>
<<if ndef $sceneCompleted or !$sceneCompleted>>
<<set $sceneCompleted to {}>>
<</if>>
<<if ndef $actressRelation or !$actressRelation>>
<<set $actressRelation to {
"rebel_rhyder": 0, "kira_noir": 0, "tommy_king": 0, "ella_knox": 0,
"lauren_phillips": 0, "cory_chase": 0, "violet_myers": 0
}>>
<</if>>
<<if ndef $studioRelation or !$studioRelation>>
<<set $studioRelation to {
"joy_media": 20, "dogfart": 0, "deeper": 0, "mofos": 0,
"nubiles": 0, "brazzers": 0, "vixen": 0, "bang": 0
}>>
<</if>>
<<if ndef $messages or !$messages>>
<<set $messages to []>>
<</if>>
<<if ndef $actionsLeft>>
<<set $actionsLeft to 3>>
<<set $actionsMax to 3>>
<</if>>
<<if ndef $dayOfWeek>>
<<set $dayOfWeek to 1>>
<<set $weekNumber to 1>>
<</if>>
<<if ndef $exhaustion>>
<<set $exhaustion to 0>>
<<set $exhaustionLocked to false>>
<<set $exhaustionLockDays to 0>>
<</if>>
<<if ndef $mood>>
<<set $mood to 4>>
<</if>>
<<if ndef $exhaustionMax>>
<<set $exhaustionMax to 5>>
<<set $moodMax to 5>>
<</if>>
<<if ndef $didRecoveryToday>>
<<set $didRecoveryToday to false>>
<<set $actionsUsedToday to 0>>
<</if>>
<<if ndef $mg_Returning>>
<<set $mg_Returning to false>>
<<set $mg_Score to 0>>
<</if>>
<<if ndef $careerStarted>>
<<set $careerStarted to false>>
<<set $systemsUnlocked to false>>
<</if>>
<<if ndef $debtActive>>
<<set $debtActive to false>>
<<set $debt to 0>>
<<set $debtWeekly to 1500>>
<<set $debtDaysLeft to 7>>
<</if>>
<<if ndef $rebelPrivateReady>>
<<set $rebelPrivateReady to false>>
<</if>>
<<if ndef $kiraVouchReady>>
<<set $kiraVouchReady to false>>
<</if>>
<<if ndef $debtFailCount>>
<<set $debtFailCount to 0>>
<</if>>
<<if ndef $unreadMessages>>
<<set $unreadMessages to 0>>
<</if>>
<<if ndef $chats or !$chats>>
<<set $chats to []>>
<<set $unreadChats to 0>>
<<set $pendingRebeccaVisit to false>>
<<set $pendingRebelMeet to 0>>
<</if>>
<<if ndef $overallStudioRep>>
<<set $overallStudioRep to 0>>
<</if>>
<<if ndef $camUnlocked>><<set $camUnlocked to true>><</if>>
<<if ndef $onlyfansUnlocked>><<set $onlyfansUnlocked to false>><</if>>
<</widget>>
<<widget "ph">>
<div class="ph-img"><div><strong>Image placeholder</strong>$args[0]</div></div>
<</widget>>
/*
applyWorkLoad kind result
kind: "studio" | "escort" | "cam" | "train"
result: "good" | "bad" | "neutral"
Rules (levels 0–10):
studio good/neutral → exhaustion 0, mood 0
studio bad → exhaustion +1, mood −1
escort → exhaustion +1, mood −1 (always taxing)
cam → exhaustion +1, mood −1
train good → neutral
train bad → exhaustion +1
Also tracks action use for daily decay.
*/
<<widget "applyWorkLoad">>
<<set _kind to $args[0]>>
<<set _res to $args[1]>>
<<if $systemsUnlocked>>
<<set $actionsUsedToday to Math.min($actionsMax, ($actionsUsedToday || 0) + 1)>>
<</if>>
<<if _kind === "studio">>
<<if _res === "bad">>
<<set $exhaustion to Math.min($exhaustionMax, $exhaustion + 1)>>
<<set $mood to Math.max(0, $mood - 1)>>
<</if>>
<<elseif _kind === "escort" or _kind === "cam">>
<<set $exhaustion to Math.min($exhaustionMax, $exhaustion + 1)>>
<<set $mood to Math.max(0, $mood - 1)>>
<<elseif _kind === "train">>
<<if _res === "bad">>
<<set $exhaustion to Math.min($exhaustionMax, $exhaustion + 1)>>
<</if>>
<</if>>
<<if ($exhaustion >= $exhaustionMax or $mood <= 0) and not $exhaustionLocked and $systemsUnlocked>>
<<set $exhaustionLocked to true>>
<<set $exhaustionLockDays to 1>>
<</if>>
<</widget>>
<<widget "checkVersionEnd">>
<<silently>>
<<if ndef $sceneCompleted or !$sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<if ndef $versionEndSeen>><<set $versionEndSeen to false>><</if>>
<<if ndef $versionEndReady>><<set $versionEndReady to false>><</if>>
<<set _need to [
"ghs_catherine","ghs_luna","ghs_courtney","ghs_nikki","ghs_rebel","ghs_emma","ghs_chantell","ghs_rebel2","ghs_yaya","ghs_indica",
"ghx_tommy","ghx_lauren","ghx_cory","ghx_violet","ghx_ella","ghx_nia",
"ghi_nia","ghi_anna","ghi_kira","ghi_scarlit","ghi_victoria","ghi_alexis",
"esc_japanese","esc_pregnant","esc_middleeast","esc_executive","esc_soccermom",
"cam_first","cam_toy","cam_fleshlight","cam_interactive"
]>>
<<set _ok to true>>
<<for _id range _need>>
<<if not $sceneCompleted[_id]>><<set _ok to false>><</if>>
<</for>>
<<if _ok>>
<<set $versionEndReady to true>>
<</if>>
<</silently>>
<</widget>>
<<widget "bumpSwallowProgress">>
<<silently>>
<<set _done to $args[0]>>
<<if _done > ($swallowIndex || 0)>>
<<set $swallowIndex to _done>>
<</if>>
<</silently>>
<</widget>>
<<widget "applyRecovery">>
<<set $didRecoveryToday to true>>
<<if $systemsUnlocked>>
<<set $actionsUsedToday to Math.min($actionsMax, ($actionsUsedToday || 0) + 1)>>
<</if>>
<<set $exhaustion to Math.max(0, $exhaustion - 1)>>
<<set $mood to Math.min($moodMax, $mood + 1)>>
<</widget>>
/*
mgButtons type difficulty video [nextPhase]
Renders Start + Skip (gamble) for a minigame.
*/
<<widget "sceneResult">>
<<set _sc to $args[0]>>
<<set _good to $args[1] || "They'll remember that.">>
<<set _ok to $args[2] || "Workmanlike. Not legendary.">>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score"><<print _sc>><span class="pct">%</span></div>
<<if _sc >= 80>>
<div class="result-verdict great">🔥 <<print _good>></div>
<<elseif _sc >= 65>>
<div class="result-verdict great">✨ <<print _good>></div>
<<elseif _sc >= 40>>
<div class="result-verdict ok"><<print _ok>></div>
<<else>>
<div class="result-verdict rough">Rough cut — need another take.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<</widget>>
/*
mgButtons type difficulty video [nextPhase]
*/
<<widget "mgButtons">>
<<set _type to $args[0]>>
<<set _diff to $args[1] || 1>>
<<set _vid to $args[2] || "">>
<<set _p to $args[3]>>
<<set _chance to FT_skipChance(_type, _diff)>>
<<set _label to (_type === "stamina" ? "Stamina" : (_type === "technique" ? "Technique" : "Focus"))>>
<<run State.variables._ftPerfectReady = { type: _type, diff: _diff, vid: _vid, phase: _p }>>
<div class="mg-callout">
<<if $skipMinigames>>
<<set _odds to FT_skipOdds(_diff)>>
<<set _tier to FT_skipTier(_diff)>>
<div class="nav-grid">
<<capture _type _diff _vid _p>>
<<link `"Continue · " + _odds + "% good"`>>
<<run FT_continueMinigame(_type, _diff, _vid, _p)>>
<</link>>
<</capture>>
</div>
<div class="hint"><<print _tier>> check. <<print _odds>>% chance of a good result.</div>
<<else>>
<div class="nav-grid">
<<capture _type _diff _vid _p>>
<<link `"▶ Start " + _label + " (Diff " + _diff + ")"`>>
<<run FT_launchMinigame(_type, _diff, _vid, _p)>>
<</link>>
<<link `"⏭ Skip gamble (" + _chance + "% win)"`>>
<<run FT_skipMinigame(_type, _diff, _vid, _p)>>
<</link>>
<</capture>>
</div>
<div class="hint">Play for real score, or gamble a skip based on your skill.</div>
<</if>>
</div>
<</widget>><<silently>>
<<ensureVars>>
<<if ndef $statFocus>><<set $statFocus to 1>><</if>>
<<if ndef $statTechnique>><<set $statTechnique to 1>><</if>>
<<if ndef $statStamina>><<set $statStamina to 1>><</if>>
<<if ndef $money>><<set $money to 0>><</if>>
<<if ndef $weekNumber>><<set $weekNumber to 1>><</if>>
<<if ndef $dayOfWeek>><<set $dayOfWeek to 1>><</if>>
<<if ndef $actionsLeft>><<set $actionsLeft to 3>><</if>>
<<if ndef $actionsMax>><<set $actionsMax to 3>><</if>>
<<if ndef $exhaustion>><<set $exhaustion to 0>><</if>>
<<if ndef $exhaustionMax>><<set $exhaustionMax to 5>><</if>>
<<if ndef $moodMax>><<set $moodMax to 5>><</if>>
<<if ndef $mood>><<set $mood to 4>><</if>>
<<set $mood to Math.min($moodMax, Math.max(0, $mood))>>
<<set $exhaustion to Math.min($exhaustionMax || 5, Math.max(0, $exhaustion || 0))>>
<<if ndef $debt>><<set $debt to 0>><</if>>
<<if ndef $debtWeekly>><<set $debtWeekly to 1500>><</if>>
<<if ndef $debtDaysLeft>><<set $debtDaysLeft to 7>><</if>>
<<if ndef $systemsUnlocked>><<set $systemsUnlocked to false>><</if>>
<<if ndef $unreadChats>><<set $unreadChats to 0>><</if>>
<<if ndef $unreadMessages>><<set $unreadMessages to 0>><</if>>
<<if ndef $gameVersion>><<set $gameVersion to "0.1">><</if>>
<</silently>>
<div class="sidebar-panel mute-panel">
<h3>Settings</h3>
<button type="button" id="ft-mute-toggle" class="is-muted" title="Toggle video audio">🔇 Mute</button>
</div>
<div class="sidebar-panel">
<h3>Mini games</h3>
<button type="button" id="ft-skip-toggle" class="ft-skip-btn">Mini games</button>
<div class="hint">Easy 80% · Medium 50% · Hard 30% good.</div>
<script>
(function () {
var btn = document.getElementById('ft-skip-toggle');
if (!btn || btn.dataset.bound) return;
btn.dataset.bound = '1';
function sc() {
return (window.SugarCube && window.SugarCube.State) || null;
}
function paint() {
var S = sc();
var on = !!(S && S.variables && S.variables.skipMinigames);
btn.textContent = on ? 'Skipping' : 'Playing';
btn.classList.toggle('is-on', on);
}
btn.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
var S = sc();
if (!S || !S.variables) return;
S.variables.skipMinigames = !S.variables.skipMinigames;
paint();
};
paint();
})();
</script>
</div>
<div class="sidebar-panel">
<h3><<if $playerName and $playerName.trim() !== "">><<print $playerName>><<else>>You<</if>></h3>
<div class="stat-row"><span class="label">Focus</span><span class="val"><<print $statFocus>></span></div>
<div class="stat-row"><span class="label">Technique</span><span class="val"><<print $statTechnique>></span></div>
<div class="stat-row"><span class="label">Stamina</span><span class="val"><<print $statStamina>></span></div>
</div>
<<if $systemsUnlocked>>
<div class="sidebar-panel">
<h3>Career</h3>
<div class="stat-row"><span class="label">Money</span><span class="val stat-good">$<<print $money>></span></div>
<div class="stat-row"><span class="label">Week / Day</span><span class="val">W<<print $weekNumber>> · D<<print $dayOfWeek>></span></div>
<div class="stat-row"><span class="label">Actions</span><span class="val"><<print $actionsLeft>> / <<print $actionsMax>></span></div>
<div class="bar-track"><div class="bar-fill actions" @style="'width:' + Math.round(($actionsLeft / Math.max(1,$actionsMax))*100) + '%'"></div></div>
<div class="stat-row"><span class="label">Exhaustion</span><span class="val<<if $exhaustion >= 4>> stat-warn<</if>>"><<print $exhaustion>> / <<print $exhaustionMax>></span></div>
<div class="bar-track"><div class="bar-fill exhaust" @style="'width:' + Math.round(($exhaustion / Math.max(1,$exhaustionMax))*100) + '%'"></div></div>
<div class="stat-row"><span class="label">Mood</span><span class="val<<if $mood <= 1>> stat-warn<<elseif $mood >= 4>> stat-good<</if>>"><<print $mood>> / <<print $moodMax>></span></div>
<div class="bar-track"><div class="bar-fill energy" @style="'width:' + Math.round(($mood / Math.max(1,$moodMax))*100) + '%'"></div></div>
<<if $exhaustionLocked>>
<div class="stat-row"><span class="stat-warn">⚠ Work locked — <<print $exhaustionLockDays>> day(s)</span></div>
<</if>>
</div>
<<if $debtActive>>
<div class="sidebar-panel">
<h3>Debt — Rebecca</h3>
<div class="stat-row"><span class="label">Owed</span><span class="val">$<<print $debt>></span></div>
<div class="stat-row"><span class="label">Weekly due</span><span class="val">$<<print $debtWeekly>></span></div>
<div class="stat-row"><span class="label">Days left</span><span class="val<<if $debtDaysLeft <= 2>> stat-warn<</if>>"><<print $debtDaysLeft>></span></div>
</div>
<</if>>
<<else>>
<div class="sidebar-panel">
<h3>Training Phase</h3>
<div class="hint">Career systems unlock after Rebecca briefs you.</div>
</div>
<</if>>
<div class="sidebar-panel dev-strip">
<div class="stat-row"><span class="label">Version</span><span class="val"><<print $gameVersion>></span></div>
<div class="dev-links">
<a href="https://www.patreon.com/RedCupid" target="_blank" rel="noopener"><img class="dev-badge" src="career/pics/brand/patreon.png" alt="Patreon"></a>
<a href="https://subscribestar.adult/redcupid" target="_blank" rel="noopener"><img class="dev-badge" src="career/pics/brand/subscribestar.png" alt="SubscribeStar"></a>
</div>
<div class="dev-by">By REDCUPID</div>
</div><<set $gameStarted to true>>
<div class="passage-title">A Modern Porn Star</div>
<div class="story-img"><img src="career/pics/story/title_card.jpg" alt="Title card" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<div class="panel">
<div class="panel-title">Content warning</div>
<b>18+ NSFW.</b> Explicit sex, adult language, industry themes, power imbalance, and performance pressure.
</div>
You are 19, fresh out of high school, with almost no money and no plan — until a neighborhood flyer changes everything.
<div class="nav-grid">
[[Begin Your Journey|Prologue]]
</div><div class="passage-title">Neighborhood Flyer</div>
You’re 19. Fresh out of high school. No college plans, no job prospects, and your savings are almost gone.
Another boring day in your small neighborhood… until you see it.
<div class="story-img"><img src="career/pics/story/flyer_pole.jpg" alt="Audition flyer" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
---
You pick it up. Your heart starts beating faster as you read the words again.
<div class="panel">
<b>Open Auditions — Adult Content Creators & Performers Wanted</b><br>
High pay · Flexible schedule · Immediate start<br>
Neighborhood studio — walk-ins welcome
</div>
<div class="story-img"><img src="career/pics/story/flyer_hands.jpg" alt="Holding flyer" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
---
You’ve watched enough videos late at night to understand exactly what kind of auditions these are. Part of you is scared. Another part is excited. This could be a way out.
<div class="story-img"><img src="career/pics/story/bedroom_mirror.jpg" alt="Mirror decision" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<div class="nav-grid">
[[Step Inside|Name Entry]]
</div><div class="passage-title">Who Are You?</div>
<div class="story-img"><img src="career/pics/story/name_clipboard.jpg" alt="Name paperwork" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
Before you walk into the studio, you write the name you’ll use in this industry — the one they’ll call on set, on contracts, and when someone wants you back.
<div class="panel">
<div class="panel-title">Your name</div>
<<textbox "$playerName" $playerName>>
<div class="hint" style="margin-top:8px;">This name appears in dialogue and scene text everywhere.</div>
</div>
<div class="panel">
<div class="panel-title">Your look</div>
Two storylines. Pick the one you want to play.
<div class="look-grid">
<label class="look-pick">
<<radiobutton "$playerPath" "white" checked>>
<div class="look-card">
<img src="career/pics/avatars/player.jpg" alt="White player" onerror="this.style.background='#0a3d62'">
<div class="look-meta">
<div class="look-note">Current story</div>
</div>
</div>
</label>
<label class="look-pick">
<<radiobutton "$playerPath" "black">>
<div class="look-card">
<img src="career/pics/avatars/black_player.jpg" alt="Black player" onerror="this.style.background='#3e2723'">
<div class="look-meta">
<div class="look-note">Preview Only</div>
</div>
</div>
</label>
</div>
</div>
<div class="panel">
<div class="panel-title">Mini games</div>
<<checkbox "$skipMinigames" false true>> Mini games
<div class="hint" style="margin-top:8px;">Skip the checks. Easy scenes 80% good, medium 50%, hard 30%. You can change this anytime in the sidebar.</div>
</div>
<<link "Confirm and enter the studio">>
<<if not $playerName or !$playerName.trim()>>
<<set $playerName to "Alex">>
<<else>>
<<set $playerName to $playerName.trim()>>
<</if>>
<<if $playerPath === "black">>
<<goto "Black Player Preview">>
<<else>>
<<set $playerPath to "white">>
<<goto "First Meeting - Rebecca">>
<</if>>
<</link>><div class="passage-title">Audition — Jazz</div>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A01.webm" type="video/webm"></video>
</div>
You follow the flyer to the studio. A woman is already waiting in the lounge, tablet in her lap, looking you over the second you walk in. She smiles like she’s done this a hundred times.
<<speech "jazz" "Jazz">>$playerName. You answered the flyer. I’m Jazz — I run auditions for Joy Media. Sit. We’re not doing paperwork first.<</speech>>
<<speech "you">>Okay. I figured if I showed up, that was the hard part.<</speech>>
<<speech "jazz" "Jazz">>Cute. Confidence is fine. Let’s see if it matches what’s in your pants.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A0.webm" type="video/webm"></video>
</div>
She undoes his pants and pulls him free. For a second she just looks. Then she smiles — wide, surprised, genuinely happy.
<<speech "jazz" "Jazz">>Oh. Oh, baby. Look at that.<</speech>>
<<speech "you">>…Is that good?<</speech>>
<<speech "jazz" "Jazz">>That’s better than good. That’s a booking. Come here.<</speech>>
She leans in and starts licking him immediately, slow and careful, like she’s confirming what she just saw.
<<speech "jazz" "Jazz">>Heavy. Thick. Most guys who walk in here are selling a fantasy. You’re not.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A1.webm" type="video/webm"></video>
</div>
She starts blowing him properly and holds her phone up, filming it.
<<speech "jazz" "Jazz">>Hold still. I’m recording this. Not for you — for me. I want the tape of the first time I saw this cock.<</speech>>
<<speech "you">>You’re… really good at that.<</speech>>
<<speech "jazz" "Jazz">>I’ve been doing this longer than you’ve been old enough to walk in. Don’t fight it. Just let me work.<</speech>>
<<speech "you">>Jazz, I can handle it. I’m not gonna—<</speech>>
<<speech "jazz" "Jazz">>Shh. You’re already twitching. Cute.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A2.webm" type="video/webm"></video>
</div>
She opens her throat and looks up at him.
<<speech "jazz" "Jazz">>Now you move. Slow. My mouth is open. Use it.<</speech>>
<<speech "you">>Okay. Yeah. I got this.<</speech>>
<<speech "jazz" "Jazz">>There it is. You’re fighting it already. Don’t lock up — breathe.<</speech>>
<<speech "you">>I’m fine. I can keep going.<</speech>>
<<speech "jazz" "Jazz">>You can try.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A3.webm" type="video/webm"></video>
</div>
He stops moving. She takes him deep on her own, then pulls off and spreads the spit down the shaft with both hands. She can feel him tensing.
<<speech "jazz" "Jazz">>Not in my mouth. Not on the first take. You’re already right there.<</speech>>
<<speech "you">>I’m not— I’m good. I can last.<</speech>>
<<speech "jazz" "Jazz">>You can last long enough for me to switch. That’s all I need from you right now.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A4.webm" type="video/webm"></video>
</div>
She strokes him again, licking the head, knowing he’ll finish if she goes hard. He’s starting to get cocky.
<<speech "you">>See? I told you. I can handle you.<</speech>>
<<speech "jazz" "Jazz">>You can handle my hand. That’s not the same thing, baby.<</speech>>
<<speech "you">>Try me.<</speech>>
<<speech "jazz" "Jazz">>Alright. You asked.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A5.webm" type="video/webm"></video>
</div>
She gets on all fours on the couch and looks back at him.
<<speech "jazz" "Jazz">>Oil. On you, and on me. If you really think you can handle this, prove it. Spread it.<</speech>>
<<speech "you">>Yeah. I can do this.<</speech>>
<<speech "jazz" "Jazz">>Slow. Cover it. I want you slippery before you even try to put that in me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A6.webm" type="video/webm"></video>
</div>
She shakes her ass while he works the oil in, then places his cock between her cheeks. He’s completely hard. She’s smiling.
<<speech "jazz" "Jazz">>Look at you. Desperate already, and you haven’t even been inside me.<</speech>>
<<speech "you">>You’re doing that on purpose.<</speech>>
<<speech "jazz" "Jazz">>Of course I am. And I’m still excited. This cock is ridiculous. I want it in me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A7.webm" type="video/webm"></video>
</div>
After enough teasing she reaches back and guides him in. She struggles for a second, then takes all of him.
<<speech "jazz" "Jazz">>Oh— fuck. That’s a lot. Stay still. Let me have it.<</speech>>
<<speech "you">>You’re taking it. All of it.<</speech>>
<<speech "jazz" "Jazz">>I am. Don’t get proud yet. Move when I say.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A8.webm" type="video/webm"></video>
</div>
He starts moving. Slow at first. She’s tight, squeezing around him, and within a few strokes he’s already twitching.
<<speech "jazz" "Jazz">>Breathe. You’re clenching. That’s your body quitting on you.<</speech>>
<<speech "you">>I can keep— Jazz, I’m—<</speech>>
<<speech "jazz" "Jazz">>I know. You’re not going to make it. That’s okay. Pull out when you can’t hold it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/bbc/A9.webm" type="video/webm"></video>
</div>
He pulls out and finishes all over her ass in under a few minutes. She’s still shaking it for him, calm about it.
<<speech "you">>Shit. I’m sorry. That was— I thought I could last longer.<</speech>>
<<speech "jazz" "Jazz">>Don’t apologize for the load. Look at that. Volume matches the rest of you.<</speech>>
She looks back at him, still on the couch, not angry. Sweet, almost.
<<speech "jazz" "Jazz">>You’re selected. I don’t say that lightly. That cock is the kind of thing this industry actually pays for.<</speech>>
<<speech "you">>So I can start working?<</speech>>
<<speech "jazz" "Jazz">>Not yet. You don’t know how to use it. You finished the second it felt too good. That’s fine for a first time. It’s not fine on a real set.<</speech>>
<<speech "jazz" "Jazz">>I’m sending you to my friends. They train the ones who have the equipment and none of the control. You do that, or you don’t make a living out of this. Your choice.<</speech>>
<<speech "you">>I’ll do it. I can get better.<</speech>>
<<speech "jazz" "Jazz">>I know you can. That’s why I’m not walking you out. Come back when you can last long enough to be worth booking. Until then, don’t waste that cock.<</speech>>
She sits up, wipes a thumb across her ass, and smiles at the camera like the audition just closed the way she wanted.
<div class="panel">
<div class="panel-title">Black player preview</div>
This is the first scene of the Black path. The rest of that storyline isn’t in this build yet.
</div>
<div class="nav-grid">
[[Back to name entry|Name Entry]]
</div>You arrive at the studio and get led onto a kitchen set. Rebecca is already there, leaning against the island with her arms crossed. She looks you over without smiling.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/11.webm" type="video/webm"></video>
</div>
Rebecca studies you for a long moment before she speaks.
<<speech "rebecca">>$playerName. You’re the one who answered the flyer. Come closer.<</speech>>
<<speech "you">>Yes… okay.<</speech>>
<<speech "rebecca">>You’re younger than most of the guys who walk through that door. And you look like you’ve never done this before. Am I right?<</speech>>
<<speech "you">>…Yeah. First time.<</speech>>
<<speech "rebecca">>Good. Honesty is useful. Nervous is also useful. Means you’ll actually listen.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/12.webm" type="video/webm"></video>
</div>
She steps in close, cups the side of your neck, and kisses you. It’s not soft. It’s testing — the kind of kiss that checks how you respond when someone else takes control.
<<speech "rebecca">>Relax your jaw. You’re kissing like you’re afraid I’ll change my mind.<</speech>>
<<speech "you">>Sorry… I’ve just never—<</speech>>
<<speech "rebecca">>I know. That’s why we’re doing this instead of paperwork. I need to know what I’m working with.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/13.webm" type="video/webm"></video>
</div>
Her hand slides down your chest, then lower, until her palm presses firmly against the front of your pants. She doesn’t look surprised that you’re hard. She looks interested.
<<speech "rebecca">>Already? We’ve barely started. That’s either a very good sign or a very bad one.<</speech>>
<<speech "you">>Rebecca…<</speech>>
<<speech "rebecca">>Shh. Let me see it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/14.webm" type="video/webm"></video>
</div>
She drops to her knees right there on the kitchen floor, undoes your pants, and pulls you free. For a second she freezes. Her eyes widen.
<<speech "rebecca">>…Holy shit.<</speech>>
She actually laughs once under her breath, short and disbelieving.
<<speech "rebecca">>Okay. That is not what I was expecting when a nervous nineteen-year-old walked in here.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/15.webm" type="video/webm"></video>
</div>
She wraps both hands around it carefully, like she’s still processing the size. She lifts it, feels the weight, runs her thumbs along the thick shaft.
<<speech "rebecca">>Jesus… it’s heavy. And thick. Most guys who claim they’re packing something special are lying. You’re not.<</speech>>
She looks up at you, still holding it.
<<speech "rebecca">>This is the kind of cock that makes people stop scrolling. If you ever learn how to use it properly, you’re going to make a lot of money.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/16.webm" type="video/webm"></video>
</div>
She leans in and takes the head into her mouth. Slow at first, testing how much she can fit. You hear her make a small sound of surprise when she tries to go deeper.
<<speech "rebecca">>Fuck… even the head is a mouthful. Control and stamina are still what actually keep a guy booked, but this? This is a serious advantage if you don’t waste it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/17.webm" type="video/webm"></video>
</div>
She pulls her top off without breaking rhythm, letting her breasts press against your thighs while she keeps working you with her mouth.
<<speech "rebecca">>You’re stretching my mouth already. Most guys would be thrusting by now. Don’t.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/18.webm" type="video/webm"></video>
</div>
She looks up at you, eyes steady, lips still wet.
<<speech "rebecca">>Put your hand on the back of my head. Don’t be gentle. I want to feel what your instincts are like when no one’s telling you to hold back.<</speech>>
<<speech "you">>Like this?<</speech>>
<<speech "rebecca">>Harder. I said don’t be gentle.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/19.webm" type="video/webm"></video>
</div>
After a while she pulls off, breathes, then cups her breasts around you right there on the kitchen floor.
<<speech "rebecca">>Now fuck them. Nice and slow. Feel how they move around you.<</speech>>
<<speech "you">>Fuck… that feels good.<</speech>>
<<speech "rebecca">>Of course it does. Everything feels good when you’re this worked up. The question is whether you can last once you’re actually inside someone.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/110.webm" type="video/webm"></video>
</div>
She stands, turns, and bends over the kitchen counter, bracing her hands on the cool surface. She looks back at you over her shoulder.
<<speech "rebecca">>Come here. Put it in. Don’t rush the first thrust.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/111.webm" type="video/webm"></video>
</div>
You try. You really try. But after only a short stretch of holding a steady rhythm against the counter, your body starts overriding your brain.
<<speech "rebecca">>Pace, $playerName. You’re going too hard too early.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/112.webm" type="video/webm"></video>
</div>
Your voice comes out strained.
<<speech "you">>I can’t… I’m gonna cum. I’m sorry—<</speech>>
<<speech "rebecca">>Then pull out. Finish on my ass. Now.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/113.webm" type="video/webm"></video>
</div>
You barely make it. Thick ropes land across her lower back and ass as you groan through it, legs shaking, hands still gripping the edge of the counter.
<<speech "rebecca">>…That’s a lot. At least the volume matches the rest of you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/114.webm" type="video/webm"></video>
</div>
She turns around, still leaning against the counter, and calmly cleans you with her mouth while you’re still sensitive. When she finishes she stands up straighter, wipes the corner of her mouth with her thumb, and looks at you with a more measured expression.
<<speech "rebecca">>You have the equipment. That’s rare enough that it matters. But right now you’re still a liability on a real set. You last under a minute, you have no control, and you panic the second it starts feeling too good.<</speech>>
<<speech "you">>I can get better.<</speech>>
<<speech "rebecca">>You will get better, or you won’t work for me. I’m sending you to Raya. She trains the ones who actually have potential. I’ll cover the cost for now. You pay me back by working once you’re ready. That’s the deal.<</speech>>
<<speech "you">>I’ll do it. Whatever she says.<</speech>>
<<speech "rebecca">>Good answer. Come back when she says you’re not embarrassing anymore. Until then, don’t waste my time.<</speech>>
She picks her top up off the counter and starts putting herself back together like the last twenty minutes were just another meeting on the set.
<<speech "rebecca">>Welcome to the industry, $playerName. Try not to disappoint me.<</speech>>
[[Continue|First Meeting - Raya]]<<set $energy to 100>>
<<set $actionsLeft to $actionsMax>>
<<set $dayOfWeek += 1>>
<<if $dayOfWeek > 7>>
<<set $dayOfWeek to 1>>
<<set $weekNumber += 1>>
<</if>>
/* Reshuffle which stars are out in the city */
<<script>>
(function() {
var pool = [];
var ar = State.variables.actressRelation || {};
var completed = State.variables.sceneCompleted || {};
if (completed["ghs_06"] || State.variables.metRebelRhyder) pool.push("rebel_rhyder");
if (completed["ghs_08"] || State.variables.metKiraNoir) pool.push("kira_noir");
if (completed["ghx_01"]) pool.push("tommy_king");
if (completed["ghx_02"]) pool.push("ella_knox");
if (completed["ghx_03"]) pool.push("lauren_phillips");
if (completed["ghx_04"]) pool.push("cory_chase");
if (completed["ghx_05"]) pool.push("violet_myers");
// pick 0–2 stars at random locations
var out = [];
pool = pool.slice().sort(function(){ return Math.random()-0.5; });
var n = Math.min(pool.length, Math.floor(Math.random()*3));
var locs = ["Park","Mall","Cafe","Gym","City"];
for (var i=0;i<n;i++) {
out.push({ id: pool[i], location: locs[Math.floor(Math.random()*locs.length)] });
}
State.variables.cityStars = out;
})();
<</script>>
/* Daily level rules (0–10 scales)
- If you used all 3 actions and did NO recovery today → exhaustion +1 and mood −1
- If you recovered today → no penalty from a full action day
- Sleep always gives a small rest: exhaustion −1 (min 0), mood +1 (max 10) unless locked */
<<if $exhaustionLocked>>
<<set $exhaustion to Math.max(0, $exhaustion - 2)>>
<<set $mood to Math.min($moodMax, $mood + 1)>>
<<set $exhaustionLockDays -= 1>>
<<if $exhaustionLockDays <= 0>>
<<set $exhaustionLocked to false>>
<<set $exhaustion to 0>>
<div class="reward">Forced rest over — you feel ready to work again.</div>
<<else>>
<div class="hint">Forced rest day. Exhaustion easing ($exhaustionLockDays day(s) left).</div>
<</if>>
<<else>>
<<if $actionsUsedToday >= $actionsMax and not $didRecoveryToday>>
<<set $exhaustion to Math.min($exhaustionMax, $exhaustion + 1)>>
<<set $mood to Math.max(0, $mood - 1)>>
<div class="danger">Hard day with no recovery — exhaustion +1, mood −1.</div>
<<elseif $didRecoveryToday>>
<div class="reward">Recovery kept you stable overnight.</div>
<</if>>
/* Natural rest from sleep */
<<set $exhaustion to Math.max(0, $exhaustion - 1)>>
<<set $mood to Math.min($moodMax, $mood + 1)>>
<</if>>
<<if ($exhaustion >= $exhaustionMax or $mood <= 0) and not $exhaustionLocked>>
<<set $exhaustionLocked to true>>
<<set $exhaustionLockDays to 1>>
<<if $mood <= 0>>
<div class="danger">Mood bottomed out — you can’t work tomorrow. Rest a full day.</div>
<<else>>
<div class="danger">Exhaustion maxed — work locked for the next day.</div>
<</if>>
<</if>>
/* Reset daily flags for the new day */
<<set $didRecoveryToday to false>>
<<set $actionsUsedToday to 0>>
<<set $studioSameDayLock to false>>
<<set $swallowSameDayLock to false>>
<<set $initiationSameDayLock to false>>
<<set $secretsSameDayLock to false>>
<<set $escortSameDayLock to false>>
<<set $camSameDayLock to false>>
/* Mail system removed */
<<silently>>
<<if $systemsUnlocked>>
<<set $careerDay to ($careerDay || 0) + 1>>
<<set $forcedMorning to "">>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<if $sceneCompleted["ghx_nia"]>><<set $storyDay3Done to true>><</if>>
<<if $sceneCompleted["ghs_rebel"]>><<set $storyDay5Done to true>><</if>>
<<if $sceneCompleted["ghs_rebel2"]>><<set $storyDay7Done to true>><</if>>
<<if Number($careerDay) === 3 and not $storyDay3Done and not $sceneCompleted["ghx_nia"]>>
<<set $forcedMorning to "day3">>
<<elseif Number($careerDay) === 5 and not $storyDay5Done and not $sceneCompleted["ghs_rebel"]>>
<<set $forcedMorning to "day5">>
<<elseif Number($careerDay) === 7 and not $storyDay7Done and not $sceneCompleted["ghs_rebel2"]>>
<<set $forcedMorning to "day7">>
<<elseif Number($careerDay) === 9 and not $storyDay9Done>>
<<set $forcedMorning to "day9">>
<<elseif Number($careerDay) === 11 and not $storyDay11Done and $unlockedDogfart>>
<<set $forcedMorning to "day11">>
<</if>>
<</if>>
<</silently>>
<<if $debtActive>>
<<set $debtDaysLeft -= 1>>
<<if $debtDaysLeft <= 0>>
You wake up to a message from Rebecca.
[[Continue|Debt Deadline]]
<<elseif $forcedMorning>>
You sleep deeply. Morning hits with a call you can’t ignore.
[[Answer|Story Forced Morning]]
<<else>>
You sleep deeply and wake up refreshed.
[[Start the next day|Bedroom Hub]]
<</if>>
<<else>>
<<if $forcedMorning>>
You sleep deeply. Morning hits with a call you can’t ignore.
[[Answer|Story Forced Morning]]
<<else>>
You sleep deeply and wake up refreshed.
[[Start the next day|Bedroom Hub]]
<</if>>
<</if>><div class="passage-title">Raya’s Place</div>
<div class="story-img"><img src="career/pics/story/raya appartment.jpg" alt="Raya loft" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
Rebecca gave you an address across town. The building is quiet. When the door opens, a petite Asian woman in her early twenties looks you up and down like she’s already decided something.
<<speech "raya">>You’re the one Rebecca called about. $playerName.<</speech>>
<<speech "you">>Yeah. She said you’d train me.<</speech>>
<<speech "raya">>She said you have size and zero control. That’s the usual combination.<</speech>>
She steps aside and lets you in. The loft is open — mats, a mirror wall, a small gym corner, nowhere that feels like a formal studio.
<<speech "raya">>I’m Raya. I don’t do pep talks. Rebecca pays me to fix the things that get rookies fired on day one: focus, technique, stamina. You train all three here. When I say you’re not embarrassing, you go back to her for a real audition.<</speech>>
<<speech "you">>How long does that take?<</speech>>
<<speech "raya">>As long as it takes. Fail a session and you run it again. Pass and we move on. Simple.<</speech>>
She walks you through the space, pointing at the gym, the open floor, the mirror.
<<speech "raya">>Focus is control — lasting when it feels too good. Technique is how you use your hands, your pace, your body so the other person actually feels something. Stamina is still being useful when your legs want to quit.<</speech>>
<<speech "raya">>Pick one when you’re ready. Don’t waste my time showing up half-asleep.<</speech>>
<<speech "you">>Understood.<</speech>>
<div class="panel panel-tight">
<div class="panel-title">No sound</div>
These scenes have no sound. You’ll follow the picture.
</div>
[[Continue|Training Grounds]]<div class="passage-title">Raya’s Training Space</div>
<div class="story-img"><img src="career/pics/story/raya appartment.jpg" alt="Raya training loft" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
At Raya’s place. She trains Focus, Technique, and Stamina — the only stats that matter until Rebecca unlocks your career systems.
<div class="panel">
<div class="panel-title">Current skills</div>
Focus <b>$statFocus</b> · Technique <b>$statTechnique</b> · Stamina <b>$statStamina</b>
<<if $systemsUnlocked>>
<br><span class="hint">Actions left today: $actionsLeft / $actionsMax</span>
<</if>>
</div>
She asks what you want to train.
<<if not $systemsUnlocked or $actionsLeft >= 1>>
<<if $statFocus < 2>>
[[Train Focus / Sensitivity|Training - Focus]]
<<else>>
Focus already trained.
<</if>>
<<if $statTechnique < 2>>
[[Train Technique|Training - Technique]]
<<else>>
Technique already trained.
<</if>>
<<if $statStamina < 2>>
[[Train Stamina|Training - Stamina]]
<<else>>
Stamina already trained.
<</if>>
<<else>>
<span class="hint">No actions left today. Sleep to advance.</span>
<</if>>
<div class="nav-grid">[[Return to Bedroom|Bedroom Hub]]</div><<if ndef $sceneId or $sceneId !== "train_focus" or ndef $phase>>
<<set $sceneId to "train_focus">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<<set $trainTotalScore to 0>>
<<set $trainS1 to 0>>
<<set $trainS2 to 0>>
<<set $trainS3 to 0>>
<</if>>
<<if $phase == 0>>
# Focus / Sensitivity Training - Round 1
Raya is already naked when you walk in. She doesn’t bother with small talk.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn11.webm" type="video/webm"></video>
</div>
She picks up a fleshlight and wraps it around your cock, stroking slowly.
<<speech "raya">>Today is about control. Not how hard you get. Not how big you are. How long you can last when it starts feeling too good.<</speech>>
<<speech "raya">>Focus on something that isn’t this. Don’t let your body decide for you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn12.webm" type="video/webm"></video>
</div>
She works the fleshlight in longer strokes, tighter now.
<<speech "raya">>You’re already reacting. I can feel it. Stay with me.<</speech>>
<<speech "you">>It’s tight…<</speech>>
<<speech "raya">>I know. That’s the point.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn13.webm" type="video/webm"></video>
</div>
She pushes it deeper, twisting slightly on the way down.
<<speech "raya">>Deeper. You’re starting to lose the rhythm already.<</speech>>
<<speech "you">>I’m getting close…<</speech>>
<<speech "raya">>Then fight it. Don’t just say it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn14.webm" type="video/webm"></video>
</div>
She picks up the pace, watching your face the entire time.
<<speech "raya">>I can see it in your eyes. Don’t you dare cum yet.<</speech>>
<<speech "you">>It’s getting harder to hold…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn15.webm" type="video/webm"></video>
</div>
She slows down on purpose, just enough to keep you right on the edge.
<<speech "raya">>Breathe. Think about anything else. The ceiling. The wall. My voice. Just not this.<</speech>>
<<mgButtons "focus" 1 "career/story/sn15.webm" 1>>
<<elseif $phase == 1>>
<<set $trainS1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
# Focus / Sensitivity Training - Round 2
She slows down on purpose, just enough to keep you right on the edge.
<<speech "raya">>Breathe. Think about anything else. The ceiling. The wall. My voice. Just not this.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn16.webm" type="video/webm"></video>
</div>
She starts stroking again, steady and deliberate.
<<speech "raya">>You’re right on the edge. Stay there. Don’t go over.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn17.webm" type="video/webm"></video>
</div>
She goes harder without warning.
<<speech "raya">>Good. You held it. Now I’m not going to make it easy.<</speech>>
<<speech "you">>Fuck…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn18.webm" type="video/webm"></video>
</div>
She works the fleshlight in long, wet strokes, clearly enjoying how much she’s affecting you.
<<speech "raya">>You’re throbbing. I can feel every pulse. Still holding?<</speech>>
<<speech "you">>Barely…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn19.webm" type="video/webm"></video>
</div>
She turns around, still using the fleshlight, and looks back over her shoulder so you can see her ass while she works you.
<<speech "raya">>Look at it. Don’t look away. Keep control while you’re staring at something you want.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn110.webm" type="video/webm"></video>
</div>
She drops the fleshlight, straddles you, and sinks down onto your cock in one slow motion.
<<speech "raya">>Now feel the real thing. Same rule. You don’t get to cum until I say.<</speech>>
<<speech "you">>You’re so wet…<</speech>>
<<speech "raya">>And you’re still expected to hold it.<</speech>>
<<mgButtons "focus" 1 "career/story/sn110.webm" 2>>
<<elseif $phase == 2>>
<<set $trainS2 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
# Focus / Sensitivity Training - Round 3
She drops the fleshlight, straddles you, and sinks down onto your cock in one slow motion.
<<speech "raya">>Now feel the real thing. Same rule. You don’t get to cum until I say.<</speech>>
<<speech "you">>You’re so wet…<</speech>>
<<speech "raya">>And you’re still expected to hold it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn111.webm" type="video/webm"></video>
</div>
She picks the fleshlight back up and starts using it again, faster this time.
<<speech "raya">>I’m going to push you. Stay with me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn112.webm" type="video/webm"></video>
</div>
The intensity climbs. She doesn’t let up.
<<speech "raya">>You’re leaking. I can feel how close you are. Still not allowed.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn113.webm" type="video/webm"></video>
</div>
She climbs back on and rides you hard, using her full weight.
<<speech "raya">>This is what it feels like when a professional wants you to break. Hold it anyway.<</speech>>
<<speech "you">>I can’t… I’m going to—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn114.webm" type="video/webm"></video>
</div>
She pulls off at the last second and strokes you through it with her hand.
<<speech "raya">>Now. Cum.<</speech>>
You finish hard, spilling over her fist and onto your stomach.
<<mgButtons "focus" 1 "career/story/sn114.webm" 3>>
<<elseif $phase == 3>>
<<set $trainS3 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<set $trainTotalScore to $trainS1 + $trainS2 + $trainS3>>
She pulls off at the last second and strokes you through it with her hand.
<<speech "raya">>Now. Cum.<</speech>>
You finish hard, spilling over her fist and onto your stomach.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn115.webm" type="video/webm"></video>
</div>
She watches the load with open interest.
<<speech "raya">>That’s a lot. The size wasn’t an exaggeration.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/sn116.webm" type="video/webm"></video>
</div>
She sits back and looks at you, still flushed but already shifting into instructor mode.
<<set $finalTrainScore to Math.min(100, Math.max(0, Math.round(((Number($trainS1)||0)+(Number($trainS2)||0)+(Number($trainS3)||0))/3)))>>
<<set $lastScore to $finalTrainScore>>
<<if $finalTrainScore >= 50>>
<<if $statFocus < 2>>
<<set $statFocus += 1>>
<<set _focusGain to true>>
<<else>>
<<set _focusGain to false>>
<</if>>
<<speech "raya">>For a first real session, you didn’t completely fall apart. That’s something. Practice what we did today — the breathing, the distraction, the holding at the edge. Do it enough and you’ll last as long as you decide to.<</speech>>
<<speech "raya">>Come back when you’re ready for the next one. Technique or stamina. Your choice.<</speech>>
<<else>>
<<set _focusGain to false>>
<<speech "raya">>That wasn’t enough, $playerName. You lost focus the second it got intense. I’m not marking this as trained.<</speech>>
<<speech "raya">>Come back and run this session again. Same drills until you hold it.<</speech>>
<</if>>
<div class="result-card">
<div class="result-kicker">Training report</div>
<div class="result-score">$finalTrainScore<span class="pct">%</span></div>
<<if $finalTrainScore >= 80>>
<div class="result-verdict great">🔥 Raya is impressed — you locked the lesson in.</div>
<<elseif $finalTrainScore >= 50>>
<div class="result-verdict great">✨ Solid session — the skill sticks.</div>
<<else>>
<div class="result-verdict ok">Not enough. Run it again.</div>
<</if>>
<div class="result-tags">
<<if _focusGain>><span class="tag">+1 focus</span><</if>>
<<if not _focusGain>><span class="tag rep">Session logged</span><</if>>
</div>
</div>
<<unset $phase>>
[[Return to Training Grounds|Training Grounds]]
<</if>><<if ndef $sceneId or $sceneId !== "train_technique" or ndef $phase>>
<<set $sceneId to "train_technique">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<<set $trainTotalScore to 0>>
<<set $trainS1 to 0>>
<<set $trainS2 to 0>>
<<set $trainS3 to 0>>
<</if>>
<<if $phase == 0>>
# Technique Training - Round 1
Raya is waiting for you, already undressed. She doesn’t waste time.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t1.webm" type="video/webm"></video>
</div>
She pulls you in close and guides your cock between her legs, keeping the first thrusts slow.
<<speech "raya">>Today is about how you use it. Not just putting it in. Control the pace. Feel what you’re doing to me.<</speech>>
<<speech "raya">>Start slow. Steady. Don’t rush just because it feels good.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t2.webm" type="video/webm"></video>
</div>
She takes one of your hands and places it around her throat while you keep grinding into her.
<<speech "raya">>Use your hands. Light pressure. Grind while you fuck me. I want to feel you thinking about every movement.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t3.webm" type="video/webm"></video>
</div>
She pushes you down onto a chair and climbs on top, feeding one of her breasts into your mouth as she starts bouncing.
<<speech "raya">>Suck. Use your tongue. I’m going to ride you — your job is to stay present and not just take it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t4.webm" type="video/webm"></video>
</div>
She grabs your wrist and puts your hand back on her throat, then starts forcing herself down harder onto you.
<<speech "raya">>Now take control. Choke me properly. Guide me. Push me deeper when you want me deeper. Stop waiting for instructions.<</speech>>
<<mgButtons "technique" 1 "career/story/t4.webm" 1>>
<<elseif $phase == 1>>
<<set $trainS1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
# Technique Training - Round 2
She grabs your wrist and puts your hand back on her throat, then starts forcing herself down harder onto you.
<<speech "raya">>Now take control. Choke me properly. Guide me. Push me deeper when you want me deeper. Stop waiting for instructions.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t5.webm" type="video/webm"></video>
</div>
She turns around and bends over, looking back at you.
<<speech "raya">>Behind me. Don’t just pound. Show me you understand rhythm first.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t6.webm" type="video/webm"></video>
</div>
She reaches back, grabs your wrist, and pulls your hand into her hair.
<<speech "raya">>Pull. Harder. I want to feel the difference between you being careful and you actually fucking me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t7.webm" type="video/webm"></video>
</div>
She slows her own movements and forces you to match.
<<speech "raya">>Slow grind. Then deeper. Tease me with it. Don’t give me the whole thing every time.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t8.webm" type="video/webm"></video>
</div>
She straightens just enough for you to get a hand around her throat again.
<<speech "raya">>Neck. Use me. I want to feel like you’re the one deciding the pace now.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t9.webm" type="video/webm"></video>
</div>
Her legs start to shake. She still doesn’t tell you to stop.
<<speech "raya">>I’m barely holding myself up. Keep going. Don’t get soft just because I’m reacting.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t10.webm" type="video/webm"></video>
</div>
She pulls herself upright by your arm, then forces your hand into her hair and the other around her throat so you can push her back down onto your cock.
<<speech "raya">>Pull me up. Then put me back on it. Your pace. Your depth. Show me you learned something.<</speech>>
<<mgButtons "technique" 1 "career/story/t10.webm" 2>>
<<elseif $phase == 2>>
<<set $trainS2 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
# Technique Training - Round 3
She pulls herself upright by your arm, then forces your hand into her hair and the other around her throat so you can push her back down onto your cock.
<<speech "raya">>Pull me up. Then put me back on it. Your pace. Your depth. Show me you learned something.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t11.webm" type="video/webm"></video>
</div>
She sits you back down and climbs on, facing you.
<<speech "raya">>Hands on my ass. Guide me. Deeper when you want it deeper.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t12.webm" type="video/webm"></video>
</div>
She starts moving faster, then looks at you expecting you to take over.
<<speech "raya">>Faster. Push me down when I start getting lazy. Don’t let me control the whole thing.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t13.webm" type="video/webm"></video>
</div>
She feels you getting close and immediately climbs off.
<<speech "raya">>I can feel it. On your knees isn’t an option — I’m getting on mine. Finish on my face.<</speech>>
<<mgButtons "technique" 1 "career/story/t13.webm" 3>>
<<elseif $phase == 3>>
<<set $trainS3 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<set $trainTotalScore to $trainS1 + $trainS2 + $trainS3>>
She feels you getting close and immediately climbs off.
<<speech "raya">>I can feel it. On your knees isn’t an option — I’m getting on mine. Finish on my face.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t14.webm" type="video/webm"></video>
</div>
She drops to her knees in front of you, mouth open, eyes up.
<<speech "raya">>Now. All of it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/t15.webm" type="video/webm"></video>
</div>
You finish across her face and lips. She doesn’t flinch.
<<speech "raya">>Good. You actually listened for most of that.<</speech>>
She wipes her mouth with the back of her hand and looks at you with a more serious expression.
<<set $finalTrainScore to Math.min(100, Math.max(0, Math.round(((Number($trainS1)||0)+(Number($trainS2)||0)+(Number($trainS3)||0))/3)))>>
<<set $lastScore to $finalTrainScore>>
<<if $finalTrainScore >= 50>>
<<if $statTechnique < 2>>
<<set $statTechnique += 1>>
<<set _techGain to true>>
<<else>>
<<set _techGain to false>>
<</if>>
<<speech "raya">>Technique isn’t about looking pretty on camera. It’s about making the other person feel like you know exactly what you’re doing to them. Keep practicing the control and the hand use.<</speech>>
<<speech "raya">>Come back when you’re ready for stamina. Or if you want to run this again.<</speech>>
<<else>>
<<set _techGain to false>>
<<speech "raya">>You were going through the motions, $playerName. Technique isn’t thrusting harder — it’s deliberate. This one doesn’t count.<</speech>>
<<speech "raya">>Come back and run the session again until it sticks.<</speech>>
<</if>>
<div class="result-card">
<div class="result-kicker">Training report</div>
<div class="result-score">$finalTrainScore<span class="pct">%</span></div>
<<if $finalTrainScore >= 80>>
<div class="result-verdict great">🔥 Raya is impressed — you locked the lesson in.</div>
<<elseif $finalTrainScore >= 50>>
<div class="result-verdict great">✨ Solid session — the skill sticks.</div>
<<else>>
<div class="result-verdict ok">Not enough. Run it again.</div>
<</if>>
<div class="result-tags">
<<if _techGain>><span class="tag">+1 technique</span><</if>>
<<if not _techGain>><span class="tag rep">Session logged</span><</if>>
</div>
</div>
<<unset $phase>>
[[Return to Training Grounds|Training Grounds]]
<</if>><<if ndef $sceneId or $sceneId !== "train_stamina" or ndef $phase>>
<<set $sceneId to "train_stamina">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<<set $trainTotalScore to 0>>
<<set $trainS1 to 0>>
<<set $trainS2 to 0>>
<<set $trainS3 to 0>>
<</if>>
<<if $phase == 0>>
# Stamina Training - Round 1
Raya takes you into the home gym area of her place. She strips without ceremony and pulls your shorts down.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st11.webm" type="video/webm"></video>
</div>
She drops to her knees, takes you into her mouth, and looks up.
<<speech "raya">>Stamina is what separates the ones who get booked from the ones who get replaced. Girls will want hours. If you fold after a few minutes, you’re useless on a real set.<</speech>>
<<speech "raya">>Start lifting. I’m not stopping just because it feels good for you. Keep the reps going.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st12.webm" type="video/webm"></video>
</div>
She works you with more intent, one hand stroking the base while she sucks.
<<speech "raya">>Keep lifting. Don’t let the pleasure make you drop the weight.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st13.webm" type="video/webm"></video>
</div>
She takes you deeper, holding herself there longer.
<<speech "raya">>Deeper. The weights don’t get lighter just because my throat is around you. Keep going.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st14.webm" type="video/webm"></video>
</div>
She shifts lower, mouth on your balls while her hand keeps stroking.
<<speech "raya">>Breathe. Controlled breaths. If you can’t manage this, you won’t last through a real scene.<</speech>>
<<mgButtons "stamina" 1 "career/story/st14.webm" 1>>
<<elseif $phase == 1>>
<<set $trainS1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
# Stamina Training - Round 2
She shifts lower, mouth on your balls while her hand keeps stroking.
<<speech "raya">>Breathe. Controlled breaths. If you can’t manage this, you won’t last through a real scene.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st15.webm" type="video/webm"></video>
</div>
She returns to sucking you properly, steady and deep.
<<speech "raya">>Still lifting. I can feel your legs starting to shake. Don’t quit.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st16.webm" type="video/webm"></video>
</div>
She locks eyes with you and takes you all the way down.
<<speech "raya">>Look at me. Deepthroat and weights at the same time. This is the baseline, not the hard part.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st17.webm" type="video/webm"></video>
</div>
She pulls off and wraps her tits around your cock instead.
<<speech "raya">>Between them now. Keep the reps. Don’t get lazy just because it feels different.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st18.webm" type="video/webm"></video>
</div>
She works her chest up and down your length while watching your form.
<<speech "raya">>You’re starting to fade. Focus. The moment you stop thinking about the lift is the moment you lose the session.<</speech>>
<<mgButtons "stamina" 1 "career/story/st18.webm" 2>>
<<elseif $phase == 2>>
<<set $trainS2 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
# Stamina Training - Round 3
She works her chest up and down your length while watching your form.
<<speech "raya">>You’re starting to fade. Focus. The moment you stop thinking about the lift is the moment you lose the session.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st19.webm" type="video/webm"></video>
</div>
She goes back to her mouth for a stretch, slower this time.
<<speech "raya">>Short recovery. Mouth only. Then we go again.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st110.webm" type="video/webm"></video>
</div>
She switches back to her tits without giving you a real break.
<<speech "raya">>Back between them. You’re close — I can tell. That doesn’t mean you stop lifting.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st111.webm" type="video/webm"></video>
</div>
She strokes you with one hand while keeping the pressure on with her chest.
<<speech "raya">>Breathe through it. Controlled. You’re not allowed to finish just because your arms are burning.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st112.webm" type="video/webm"></video>
</div>
She keeps the titfuck going, steady and relentless.
<<speech "raya">>Almost there. Don’t collapse on me now.<</speech>>
<<mgButtons "stamina" 1 "career/story/st112.webm" 3>>
<<elseif $phase == 3>>
<<set $trainS3 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<set $trainTotalScore to $trainS1 + $trainS2 + $trainS3>>
She keeps the titfuck going, steady and relentless.
<<speech "raya">>Almost there. Don’t collapse on me now.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st113.webm" type="video/webm"></video>
</div>
Your arms are shaking. She’s still not letting up.
<<speech "raya">>Push. You’re at the limit. That’s the point of this.<</speech>>
<<speech "you">>I’m about to cum…<</speech>>
<<speech "raya">>Then finish on my tits. Now.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st114.webm" type="video/webm"></video>
</div>
You unload across her chest. She stays in place until you’re done.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/st115.webm" type="video/webm"></video>
</div>
She sits back on her heels, looking at the mess and then at you.
<<set $finalTrainScore to Math.min(100, Math.max(0, Math.round(((Number($trainS1)||0)+(Number($trainS2)||0)+(Number($trainS3)||0))/3)))>>
<<set $lastScore to $finalTrainScore>>
<<if $finalTrainScore >= 50>>
<<if $statStamina < 2>>
<<set $statStamina += 1>>
<<set _stamGain to true>>
<<else>>
<<set _stamGain to false>>
<</if>>
<<speech "raya">>You lasted longer than most new guys do under this kind of pressure. That’s usable.<</speech>>
<<speech "raya">>Stamina isn’t about never getting tired. It’s about not letting the tiredness decide when you stop. When you’ve run all three — focus, technique, stamina — go back to Rebecca.<</speech>>
<<else>>
<<set _stamGain to false>>
<<speech "raya">>You folded early, $playerName. Stamina isn’t about never getting tired — it’s about not quitting when you are. This pass doesn’t count.<</speech>>
<<speech "raya">>Come back and try this again. Same workout until it’s clean.<</speech>>
<</if>>
<div class="result-card">
<div class="result-kicker">Training report</div>
<div class="result-score">$finalTrainScore<span class="pct">%</span></div>
<<if $finalTrainScore >= 80>>
<div class="result-verdict great">🔥 Raya is impressed — you locked the lesson in.</div>
<<elseif $finalTrainScore >= 50>>
<div class="result-verdict great">✨ Solid session — the skill sticks.</div>
<<else>>
<div class="result-verdict ok">Not enough. Run it again.</div>
<</if>>
<div class="result-tags">
<<if _stamGain>><span class="tag">+1 stamina</span><</if>>
<<if not _stamGain>><span class="tag rep">Session logged</span><</if>>
</div>
</div>
<<unset $phase>>
[[Return to Training Grounds|Training Grounds]]
<</if>><<if ndef $sceneId or $sceneId !== "audition_rebecca" or ndef $phase>>
<<set $sceneId to "audition_rebecca">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
# Final Audition with Rebecca
You call Rebecca and tell her the training with Raya is done.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f1.webm" type="video/webm"></video>
</div>
<<speech "rebecca">>Good. Come to the studio right now. I want to see the difference myself.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f2.webm" type="video/webm"></video>
</div>
You arrive. Rebecca doesn’t wait. She pulls you in and kisses you hard, testing the same way she did the first time.
<<speech "rebecca">>Show me what actually stuck.<</speech>>
<<speech "you">>I didn’t come back just to waste your time again.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f3.webm" type="video/webm"></video>
</div>
She pulls her dress down and exposes her tits.
<<speech "rebecca">>Mouth on them. Hands too. Don’t be gentle just because I’m the one who hired you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f4.webm" type="video/webm"></video>
</div>
She undoes your pants and stares for a second when she sees you’re already hard.
<<speech "rebecca">>Still ridiculous. I keep thinking I exaggerated it in my head. I didn’t.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f5.webm" type="video/webm"></video>
</div>
She drops to her knees and takes you into her mouth without preamble.
<<speech "rebecca">>Thick. Heavy. Same as before. Now let’s see if the rest of you improved.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f6.webm" type="video/webm"></video>
</div>
She forces herself deeper, eyes watering slightly as she works.
<<speech "rebecca">>Fuck… still a mouthful. Don’t just stand there.<</speech>>
<<speech "you">>You told me not to treat you carefully. I’m listening this time.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f7.webm" type="video/webm"></video>
</div>
She looks up and opens her mouth wider, waiting.
<<speech "rebecca">>Use it. I want to feel whether you learned anything about control or if you’re still just big.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f9.webm" type="video/webm"></video>
</div>
You take her head and push deeper. She gags once, then adjusts and takes it.
<<speech "rebecca">>Harder. Don’t treat me like I’ll break.<</speech>>
<<mgButtons "technique" 1 "career/story/f9.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
You take her head and push deeper. She gags once, then adjusts and takes it.
<<speech "rebecca">>Harder. Don’t treat me like I’ll break.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f10.webm" type="video/webm"></video>
</div>
You sit. She follows immediately, mouth and hand working together while she looks up at you.
<<speech "rebecca">>That’s better. Keep going. I want to see the stamina under pressure, not just the size.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>It’s a lot harder to stay focused when you’re doing that on purpose…<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f11.webm" type="video/webm"></video>
</div>
She shifts, hanging her head off the edge so you can use her throat at a better angle.
<<speech "rebecca">>Like this. All the way. Don’t stop when I make noise.<</speech>>
<<mgButtons "stamina" 1 "career/story/f11.webm" 2>>
<<elseif $phase == 2>>
<<set $mg_Score2 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
She shifts, hanging her head off the edge so you can use her throat at a better angle.
<<speech "rebecca">>Like this. All the way. Don’t stop when I make noise.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f12.webm" type="video/webm"></video>
</div>
You fuck her throat properly. She takes it, eyes watering, one hand still stroking the base.
<<speech "rebecca">>Deeper. I can take it.<</speech>>
<<speech "you">>I can feel you trying to adjust around it. Just stay open.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f13.webm" type="video/webm"></video>
</div>
She climbs on top of you and sinks down onto your cock in one slow motion.
<<speech "rebecca">>Now the real test. Show me the control. Show me the technique. Don’t just last — make it good.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f14.webm" type="video/webm"></video>
</div>
She rides you slowly at first, watching your face the entire time.
<<speech "rebecca">>Hold it. I want to feel you fighting the urge, not giving in to it.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m right at the edge. If you keep moving that slow I’m going to lose it…<</speech>></span>
<<mgButtons "focus" 1 "career/story/f14.webm" 3>>
<<elseif $phase == 3>>
<<set $mg_Score3 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
She rides you slowly at first, watching your face the entire time.
<<speech "rebecca">>Hold it. I want to feel you fighting the urge, not giving in to it.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m right at the edge. If you keep moving that slow I’m going to lose it…<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f15.webm" type="video/webm"></video>
</div>
She speeds up, bouncing harder.
<<speech "rebecca">>Faster. Still not allowed to cum. Prove the training actually worked.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f16.webm" type="video/webm"></video>
</div>
You grab her ass, spank her once, and start controlling the rhythm from below.
<<speech "you">>I’ve got the pace. Stop testing me and just take it.<</speech>>
<<speech "rebecca">>Yes. Take it. Don’t wait for me to lead the whole time.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f17.webm" type="video/webm"></video>
</div>
You push her forward onto all fours and take her from behind.
<<speech "rebecca">>Deeper. I want to feel every inch you’re supposed to know how to use.<</speech>>
<<speech "you">>You’re gripping me tighter in this position. I can feel every time you tense up.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f18.webm" type="video/webm"></video>
</div>
You lock an arm around her neck and drive into her harder.
<<speech "rebecca">>Choke me. Don’t ask. Just do it while you fuck me.<</speech>>
<<mgButtons "focus" 1 "career/story/f18.webm" 4>>
<<elseif $phase == 4>>
<<set $mg_Score4 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
You lock an arm around her neck and drive into her harder.
<<speech "rebecca">>Choke me. Don’t ask. Just do it while you fuck me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f19.webm" type="video/webm"></video>
</div>
You flip her onto her back and sink back in.
<<speech "rebecca">>Right there. Deep. Keep that pace.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f20.webm" type="video/webm"></video>
</div>
You fuck her hard in missionary. She’s properly moaning now, no longer just testing.
<<speech "rebecca">>Fuck… you actually got better. Don’t stop.<</speech>>
<<speech "you">>I’m not planning to. Not until you tell me to.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f21.webm" type="video/webm"></video>
</div>
You sit back. She turns around and rides you reverse, using your hands on her hips for leverage.
<<speech "rebecca">>Guide me. Deeper when you want it deeper. You’re supposed to be the one in control now.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>If you keep dropping your weight like that I’m not going to last much longer…<</speech>></span>
<<mgButtons "technique" 1 "career/story/f21.webm" 5>>
<<elseif $phase == 5>>
<<set $mg_Score5 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
You sit back. She turns around and rides you reverse, using your hands on her hips for leverage.
<<speech "rebecca">>Guide me. Deeper when you want it deeper. You’re supposed to be the one in control now.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>If you keep dropping your weight like that I’m not going to last much longer…<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f22.webm" type="video/webm"></video>
</div>
She comes hard on your cock, shaking, still moving through it.
<<speech "rebecca">>Shit… okay. That one was real.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f23.webm" type="video/webm"></video>
</div>
She climbs off and drops to her knees in front of you, tits pushed together.
<<speech "rebecca">>On them. I want to see the finish after all that.<</speech>>
<<speech "you">>Stay still. I want to watch it land.<</speech>>
<<mgButtons "stamina" 1 "career/story/f23.webm" 6>>
<<elseif $phase == 6>>
<<set $mg_Score6 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<set $finalScore to Math.min(100, Math.max(0, Math.round((
(Number($mg_Score1)||0)+(Number($mg_Score2)||0)+(Number($mg_Score3)||0)+(Number($mg_Score4)||0)+(Number($mg_Score5)||0)+(Number($mg_Score6)||0)
)/6)))>>
<<set $lastScore to $finalScore>>
She climbs off and drops to her knees in front of you, tits pushed together.
<<speech "rebecca">>On them. I want to see the finish after all that.<</speech>>
<<speech "you">>Stay still. I want to watch it land.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f24.webm" type="video/webm"></video>
</div>
You stroke yourself while she licks and mouths at your balls, waiting.
<<speech "rebecca">>Now. Give it to me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f25.webm" type="video/webm"></video>
</div>
You finish hard across her chest. Thick ropes land and stay.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f26.webm" type="video/webm"></video>
</div>
She leans in and cleans you with her mouth, slow and thorough.
<<speech "rebecca">>Still a lot. At least that part never changed.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:15px;box-shadow:0 0 40px #ba55d3;margin-bottom:30px"><source src="career/story/f27.webm" type="video/webm"></video>
</div>
She finishes cleaning you, sits back, and looks at you with a different expression than the first time you met.
<<set $finalScore to Math.min(100, Math.max(0, Math.round((
(Number($mg_Score1)||0)+(Number($mg_Score2)||0)+(Number($mg_Score3)||0)+(Number($mg_Score4)||0)+(Number($mg_Score5)||0)+(Number($mg_Score6)||0)
)/6)))>>
<<set $lastScore to $finalScore>>
<<if $finalScore >= 70>>
<<speech "rebecca">>You’re not a liability anymore. The control is there. The technique is usable. The stamina held under pressure.<</speech>>
<<speech "rebecca">>You’re ready to work. Come with me — I need to explain how this industry actually pays, and what you owe me.<</speech>>
<<elseif $finalScore >= 45>>
<<speech "rebecca">>You’re better than the first time. Not polished — but you held when it counted and the size is still an advantage.<</speech>>
<<speech "rebecca">>I’ll put you to work. Expect real sets to be harder than this. Come with me; I’ll explain pay, debt, and how you stay booked.<</speech>>
<<else>>
<<speech "rebecca">>That was rough, $playerName. You’re not ready. Control slipped, and I can’t put you on a real set like this.<</speech>>
<<speech "rebecca">>Go back to Raya. Run the training again until this audition doesn’t look like a panic attack. Then we’ll talk.<</speech>>
<</if>>
<<if $finalScore >= 45>>
<<silently>>
<<set $systemsUnlocked to true>>
<<set $debtActive to true>>
<<if ndef $debtDaysLeft or $debtDaysLeft <= 0>><<set $debtDaysLeft to 7>><</if>>
<</silently>>
<</if>>
<div class="result-card">
<div class="result-kicker">Final audition</div>
<div class="result-score">$finalScore<span class="pct">%</span></div>
<<if $finalScore >= 70>>
<div class="result-verdict great">Rebecca is satisfied. Your career is open.</div>
<<elseif $finalScore >= 45>>
<div class="result-verdict ok">You passed. She expects better next time.</div>
<<else>>
<div class="result-verdict rough">Not enough — train with Raya and try the audition again.</div>
<</if>>
</div>
<<unset $phase>>
<<if $finalScore >= 45>>
[[Continue|Rebecca Briefing]]
<<else>>
[[Try the audition again|Audition A - Rebecca][$phase to 0;$mg_Returning to false]]
[[Back to Training Grounds|Training Grounds]]
<</if>>
<</if>><<if ndef $mg_Type>><<set $mg_Type to "focus">><</if>>
<style>
.mg-stage {
position: relative;
width: 100%;
max-width: 950px;
margin: 0 auto 12px;
aspect-ratio: 16/9;
border-radius: 14px;
overflow: hidden;
background: #000;
}
.mg-stage .bg-video {
position: absolute; inset: 0;
width: 100%; height: 100%;
object-fit: contain;
opacity: 0;
transition: opacity 0.25s ease;
}
.mg-stage.is-playing .bg-video { opacity: 1; }
.mg-overlay {
position: absolute; inset: 0;
z-index: 12;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: rgba(0,0,0,0.92);
transition: background 0.25s ease;
}
.mg-stage.is-playing .mg-overlay {
background: rgba(0,0,0,0.12);
pointer-events: none;
}
.mg-stage.is-playing .mg-overlay.mg-interactive {
pointer-events: auto;
background: rgba(0,0,0,0.08);
}
#mg-start-btn, #mg-start-btn-generic {
padding: 16px 40px;
font-size: 1.25rem;
font-weight: 700;
border-radius: 999px;
border: 1px solid #ba55d3;
background: rgba(186,85,211,0.55);
color: #fff;
cursor: pointer;
box-shadow: 0 8px 28px rgba(0,0,0,0.45);
pointer-events: auto;
}
.mg-start-pair {
display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; align-items: center;
pointer-events: auto;
}
.mg-start-pair button, .mg-start-pair .mg-start-btn {
padding: 14px 28px; font-size: 1.05rem; font-weight: 700; border-radius: 999px;
border: 1px solid #ba55d3; background: rgba(186,85,211,0.55); color: #fff; cursor: pointer;
box-shadow: 0 8px 28px rgba(0,0,0,0.45);
}
.mg-start-pair button.mg-start-new {
border-color: #69f0ae; background: rgba(105,240,174,0.28);
}
.mg-start-pair .mg-start-hint {
width: 100%; text-align: center; color: #ccc; font-size: 0.85rem; margin-top: 6px;
text-shadow: 0 1px 4px #000;
}
#focus-arena {
display: flex;
justify-content: center;
align-items: center;
gap: 14px;
flex-wrap: wrap;
pointer-events: auto;
}
.focus-img {
height: 160px; width: auto; max-width: 120px;
object-fit: cover; border: 3px solid transparent;
border-radius: 8px; cursor: pointer;
box-shadow: 0 5px 15px rgba(0,0,0,0.8);
}
.focus-img:hover { transform: scale(1.05); border-color: #fff; }
.mg-hud {
text-align: center;
color: #fff;
text-shadow: 0 2px 6px #000;
margin-bottom: 8px;
pointer-events: none;
}
.mg-skip-row { text-align: center; margin: 12px 0 8px; }
</style>
<div class="mg-stage" id="mg-stage">
<video class="bg-video" id="mg-bg-video" autoplay loop muted playsinline><source @src="$mg_BgVideo" type="video/webm"></video>
<div class="mg-overlay" id="mg-overlay">
<div class="mg-start-pair">
<button type="button" id="mg-start-old">▶ Old mini game</button>
<button type="button" id="mg-start-new" class="mg-start-new">▶ New mini game</button>
<div class="mg-start-hint">Old = classic 3-round pick · New = scattered safe/unsafe board</div>
</div>
</div>
<div class="mg-overlay mg-interactive" id="mg-play-ui" style="display:none; background: rgba(0,0,0,0.08);">
<div class="mg-hud">Round <span id="f-round">1</span>/3 · ⏱️ <span id="f-time">5.0</span>s</div>
<div id="focus-arena"></div>
<div class="mg-hud" id="focus-message"></div>
</div>
</div>
<div class="mg-skip-row">
<<set _ch to FT_skipChance($mg_Type, $mg_Difficulty || 1)>>
<<link `'⏭ Skip gamble (' + _ch + '% win)'`>>
<<run FT_skipCurrentMinigame()>>
<</link>>
<div class="hint">Skip is a skill-based gamble.</div>
</div>
<<script>>
$(document).one(':passagedisplay', function () {
const TOTAL_ROUNDS = 3;
const diff = State.variables.mg_Difficulty || 1;
// One safe folder + one unsafe folder (shared for all scenes)
const safeImages = [
"career/pics/safe/s1.jpg","career/pics/safe/s2.jpg","career/pics/safe/s3.jpg","career/pics/safe/s4.jpg","career/pics/safe/s5.jpg",
"career/pics/safe/s6.jpg","career/pics/safe/s7.jpg","career/pics/safe/s8.jpg","career/pics/safe/s9.jpg","career/pics/safe/s10.jpg",
"career/pics/safe/s11.jpg","career/pics/safe/s12.jpg","career/pics/safe/s13.jpg","career/pics/safe/s14.jpg","career/pics/safe/s15.jpg",
"career/pics/safe/s16.jpg","career/pics/safe/s17.jpg","career/pics/safe/s18.jpg","career/pics/safe/s19.jpg","career/pics/safe/s20.jpg"
];
const badImages = [
"career/pics/unsafe/n1.jpg","career/pics/unsafe/n2.jpg","career/pics/unsafe/n3.jpg","career/pics/unsafe/n4.jpg","career/pics/unsafe/n5.jpg",
"career/pics/unsafe/n6.jpg","career/pics/unsafe/n7.jpg","career/pics/unsafe/n8.jpg","career/pics/unsafe/n9.jpg","career/pics/unsafe/n10.jpg",
"career/pics/unsafe/n11.jpg","career/pics/unsafe/n12.jpg","career/pics/unsafe/n13.jpg","career/pics/unsafe/n14.jpg","career/pics/unsafe/n15.jpg",
"career/pics/unsafe/n16.jpg","career/pics/unsafe/n17.jpg","career/pics/unsafe/n18.jpg","career/pics/unsafe/n19.jpg","career/pics/unsafe/n20.jpg"
];
let round = 0;
let wins = 0;
let isActive = false;
let timer = null;
let timeLeft = 5.0;
const stage = document.getElementById("mg-stage");
const overlay = document.getElementById("mg-overlay");
const playUi = document.getElementById("mg-play-ui");
const arena = document.getElementById("focus-arena");
const timeDisplay = document.getElementById("f-time");
const roundDisplay = document.getElementById("f-round");
const msgDisplay = document.getElementById("focus-message");
const startBtn = document.getElementById("mg-start-btn-generic") || document.getElementById("mg-start-old");
function shuffle(a) {
return a.slice().sort(() => Math.random() - 0.5);
}
function buildRound() {
arena.innerHTML = "";
const badCount = (diff === 1) ? 2 : (diff === 2 ? 3 : 4);
const pool = [];
pool.push({ src: safeImages[Math.floor(Math.random() * safeImages.length)], isSafe: true });
const bad = shuffle(badImages);
for (let i = 0; i < badCount && i < bad.length; i++) {
pool.push({ src: bad[i], isSafe: false });
}
shuffle(pool).forEach(imgData => {
const img = document.createElement("img");
img.src = imgData.src;
img.className = "focus-img";
img.addEventListener("click", function () {
if (!isActive) return;
isActive = false;
if (timer) clearInterval(timer);
if (imgData.isSafe) {
wins++;
this.style.borderColor = "#00ff80";
msgDisplay.innerText = "Good Eye!";
msgDisplay.style.color = "#00ff80";
} else {
this.style.borderColor = "#ff1744";
msgDisplay.innerText = "Lost Focus...";
msgDisplay.style.color = "#ff1744";
}
setTimeout(nextAfterRound, 700);
});
arena.appendChild(img);
});
}
function nextAfterRound() {
if (round >= TOTAL_ROUNDS) {
finishAll();
return;
}
startRound();
}
function startRound() {
round++;
if (roundDisplay) roundDisplay.textContent = String(round);
timeLeft = Math.max(3.5, 5.5 - diff * 0.5);
if (timeDisplay) timeDisplay.textContent = timeLeft.toFixed(1);
msgDisplay.innerText = "Pick the SFW image!";
msgDisplay.style.color = "#fff";
isActive = true;
buildRound();
if (timer) clearInterval(timer);
timer = setInterval(() => {
if (!isActive) return;
timeLeft -= 0.1;
if (timeDisplay) timeDisplay.textContent = timeLeft.toFixed(1);
if (timeLeft <= 0) {
isActive = false;
clearInterval(timer);
msgDisplay.innerText = "Too Slow!";
msgDisplay.style.color = "#ff1744";
setTimeout(nextAfterRound, 700);
}
}, 100);
}
function finishAll() {
if (timer) clearInterval(timer);
const score = Math.round((wins / TOTAL_ROUNDS) * 100);
State.variables.mg_Score = score;
msgDisplay.innerText = "Rounds won: " + wins + "/" + TOTAL_ROUNDS + " · Score " + score + "%";
msgDisplay.style.color = score >= 55 ? "#00e676" : (score >= 28 ? "#ffaa00" : "#ff1744");
setTimeout(() => FT_finishMinigame(score), 1200);
}
function begin() {
if (stage) stage.classList.add("is-playing");
if (overlay) overlay.style.display = "none";
if (playUi) playUi.style.display = "flex";
startRound();
}
function beginNew() {
State.variables.mg_ProductionLaunch = true;
State.variables.trialFocusDiff = State.variables.mg_Difficulty || 1;
State.variables.trialFocusVideo = State.variables.mg_BgVideo || "career/story/t4.webm";
Engine.play("Focus Trial Play");
}
var startOld = document.getElementById("mg-start-old");
var startNew = document.getElementById("mg-start-new");
if (startOld) startOld.onclick = begin;
else if (startBtn) startBtn.onclick = begin;
if (startNew) startNew.onclick = beginNew;
$(document).one(':passagestart', () => { if (timer) clearInterval(timer); });
});
<</script>><<if ndef $mg_Type>><<set $mg_Type to "technique">><</if>>
<style>
.hit-line {
position: absolute;
left: 5%;
right: 5%;
bottom: 18%;
height: 3px;
background: linear-gradient(90deg, transparent, #00e5ff, #fff, #00e5ff, transparent);
box-shadow: 0 0 12px rgba(0, 229, 255, 0.85);
z-index: 20;
display: none;
}
.mg-stage.is-playing .hit-line { display: block; }
.hit-line::before {
content: "HIT";
position: absolute;
left: 50%;
top: -18px;
transform: translateX(-50%);
font-size: 11px;
letter-spacing: 0.15em;
color: #00e5ff;
text-shadow: 0 0 6px #000;
}
.mg-stage {
position: relative; width: 100%; max-width: 950px; margin: 0 auto 12px;
aspect-ratio: 16/9; border-radius: 14px; overflow: hidden; background: #000;
}
.mg-stage .bg-video {
position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain;
opacity: 0; transition: opacity 0.25s ease;
}
.mg-stage.is-playing .bg-video { opacity: 1; }
.mg-overlay {
position: absolute; inset: 0; z-index: 12;
display: flex; flex-direction: column; align-items: center; justify-content: center;
background: rgba(0,0,0,0.92);
}
.mg-stage.is-playing .mg-overlay.start-only { display: none; }
#mg-start-btn-generic {
padding: 16px 40px; font-size: 1.25rem; font-weight: 700; border-radius: 999px;
border: 1px solid #ba55d3; background: rgba(186,85,211,0.55); color: #fff; cursor: pointer;
}
.mg-start-pair {
display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; align-items: center;
pointer-events: auto;
}
.mg-start-pair button, .mg-start-pair .mg-start-btn {
padding: 14px 28px; font-size: 1.05rem; font-weight: 700; border-radius: 999px;
border: 1px solid #ba55d3; background: rgba(186,85,211,0.55); color: #fff; cursor: pointer;
box-shadow: 0 8px 28px rgba(0,0,0,0.45);
}
.mg-start-pair button.mg-start-new {
border-color: #69f0ae; background: rgba(105,240,174,0.28);
}
.mg-start-pair .mg-start-hint {
width: 100%; text-align: center; color: #ccc; font-size: 0.85rem; margin-top: 6px;
text-shadow: 0 1px 4px #000;
}
#rhythm-arena {
position: absolute; inset: 0; z-index: 8;
display: none; pointer-events: none;
}
.mg-stage.is-playing #rhythm-arena { display: block; }
.lane { position: absolute; bottom: 0; width: 22%; height: 100%; }
.falling-arrow { position: absolute; left: 50%; transform: translateX(-50%); font-size: 28px; }
.falling-arrow.hit { color: #00e676; }
.falling-arrow.miss { color: #ff1744; opacity: 0.5; }
.mg-hud-bar {
position: absolute; top: 10px; left: 0; right: 0; z-index: 15;
text-align: center; color: #fff; text-shadow: 0 2px 6px #000;
display: none; background: rgba(0,0,0,0.15); padding: 6px;
}
.mg-stage.is-playing .mg-hud-bar { display: block; }
.mg-skip-row { text-align: center; margin: 12px 0 8px; }
</style>
<div class="mg-stage" id="mg-stage">
<video class="bg-video" autoplay loop muted playsinline><source @src="$mg_BgVideo" type="video/webm"></video>
<div class="mg-hud-bar">⏱️ <span id="t-time">0.0</span>s · Hits <span id="t-hits">0</span> · Miss <span id="t-misses">0</span></div>
<div class="hit-line" id="tech-hit-line"></div>
<div id="rhythm-arena">
<div class="lane" data-key="ArrowLeft" style="left:8%"></div>
<div class="lane" data-key="ArrowUp" style="left:30%"></div>
<div class="lane" data-key="ArrowDown" style="left:52%"></div>
<div class="lane" data-key="ArrowRight" style="left:74%"></div>
</div>
<div class="mg-overlay start-only" id="mg-overlay">
<div class="mg-start-pair">
<button type="button" id="mg-start-old">▶ Old mini game</button>
<button type="button" id="mg-start-new" class="mg-start-new">▶ New mini game</button>
<div class="mg-start-hint">Old = falling arrows · New = one-path trace</div>
</div>
</div>
</div>
<div id="tech-message" style="text-align:center;color:#fff;"></div>
<div class="mg-skip-row">
<<set _ch to FT_skipChance($mg_Type, $mg_Difficulty || 1)>>
<<link `'⏭ Skip gamble (' + _ch + '% win)'`>>
<<run FT_skipCurrentMinigame()>>
<</link>>
</div>
<<script>>
$(document).one(':passagedisplay', function () {
const diff = State.variables.mg_Difficulty || 1;
const stat = State.variables.statTechnique || 1;
const gameTime = Math.max(8, 12 - diff + Math.floor(stat / 3));
const spawnInterval = Math.max(350, 700 - diff * 80);
const fallDuration = Math.max(1200, 2200 - diff * 200);
let hits = 0, misses = 0, timeLeft = gameTime;
let isActive = false;
let activeArrows = [];
let spawner = null, clock = null;
const keys = ["ArrowLeft", "ArrowUp", "ArrowDown", "ArrowRight"];
const keySymbols = { ArrowLeft: "⬅️", ArrowUp: "⬆️", ArrowDown: "⬇️", ArrowRight: "➡️" };
const timeDisp = document.getElementById("t-time");
const hitsDisp = document.getElementById("t-hits");
const missesDisp = document.getElementById("t-misses");
const msgDisp = document.getElementById("tech-message");
const arena = document.getElementById("rhythm-arena");
const stage = document.getElementById("mg-stage");
const startBtn = document.getElementById("mg-start-old") || document.getElementById("mg-start-btn-generic");
function spawnArrow() {
if (!isActive) return;
const key = keys[Math.floor(Math.random() * keys.length)];
const lane = arena.querySelector('.lane[data-key="' + key + '"]');
if (!lane) return;
const arrow = document.createElement("div");
arrow.className = "falling-arrow";
arrow.innerText = keySymbols[key];
arrow.dataset.key = key;
arrow.style.top = "-60px";
lane.appendChild(arrow);
const startTime = performance.now();
const arrowObj = { el: arrow, key: key, start: startTime, hit: false };
activeArrows.push(arrowObj);
function animate(now) {
if (!isActive || arrowObj.hit) return;
const progress = (now - startTime) / fallDuration;
arrow.style.top = (-60 + progress * (lane.clientHeight - 40)) + "px";
if (progress >= 1.05) {
arrow.classList.add("miss");
misses++;
if (missesDisp) missesDisp.innerText = misses;
setTimeout(() => arrow.remove(), 300);
activeArrows = activeArrows.filter(a => a !== arrowObj);
return;
}
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
}
function checkHit(pressedKey) {
if (!isActive) return;
const candidates = activeArrows.filter(a => a.key === pressedKey && !a.hit);
if (!candidates.length) return;
const now = performance.now();
let best = null, bestDist = 9999;
candidates.forEach(a => {
const progress = (now - a.start) / fallDuration;
const dist = Math.abs(progress - 0.88);
if (dist < bestDist && progress > 0.65 && progress < 1.05) {
bestDist = dist; best = a;
}
});
if (best && bestDist < 0.22) {
best.hit = true;
best.el.classList.add("hit");
hits++;
if (hitsDisp) hitsDisp.innerText = hits;
setTimeout(() => best.el.remove(), 250);
activeArrows = activeArrows.filter(a => a !== best);
}
}
const keyHandler = function (e) {
if (!isActive) return;
if (keys.includes(e.key)) { e.preventDefault(); checkHit(e.key); }
};
document.addEventListener("keydown", keyHandler);
function startTechniqueGame() {
if (isActive) return;
isActive = true;
if (stage) stage.classList.add("is-playing");
if (msgDisp) msgDisp.innerText = "Hit the arrows!";
spawner = setInterval(spawnArrow, spawnInterval);
spawnArrow();
clock = setInterval(() => {
if (!isActive) return;
timeLeft -= 0.1;
if (timeDisp) timeDisp.innerText = timeLeft.toFixed(1);
if (timeLeft <= 0) {
isActive = false;
clearInterval(clock); clearInterval(spawner);
document.removeEventListener("keydown", keyHandler);
activeArrows.forEach(a => a.el.remove());
activeArrows = [];
const total = hits + misses;
let score = total > 0 ? Math.min(100, Math.round((hits / total) * 100)) : 0;
if (hits >= 12) score = Math.min(100, score + 5);
State.variables.mg_Score = score;
if (msgDisp) {
msgDisp.innerText = score >= 60 ? "Great Technique!" : (score >= 35 ? "Decent..." : "Needs Work");
msgDisp.style.color = score >= 60 ? "#00e676" : (score >= 35 ? "#ffaa00" : "#ff1744");
}
setTimeout(() => FT_finishMinigame(score), 1200);
}
}, 100);
}
if (startBtn) startBtn.onclick = startTechniqueGame;
var startNewTech = document.getElementById("mg-start-new");
if (startNewTech) {
startNewTech.onclick = function () {
State.variables.mg_ProductionLaunch = true;
State.variables.techTrialDiff = State.variables.mg_Difficulty || 1;
State.variables.techTrialVideo = State.variables.mg_BgVideo || "career/story/t4.webm";
Engine.play("Technique Trial Play");
};
}
$(document).one(':passagestart', () => {
document.removeEventListener("keydown", keyHandler);
if (clock) clearInterval(clock);
if (spawner) clearInterval(spawner);
});
});
<</script>><<if ndef $mg_Type>><<set $mg_Type to "stamina">><</if>>
<style>
.mg-stage {
position: relative; width: 100%; max-width: 950px; margin: 0 auto 12px;
aspect-ratio: 16/9; border-radius: 14px; overflow: hidden; background: #000;
}
.mg-stage .bg-video {
position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain;
opacity: 0; transition: opacity 0.25s ease;
}
.mg-stage.is-playing .bg-video { opacity: 1; }
.mg-overlay {
position: absolute; inset: 0; z-index: 12;
display: flex; flex-direction: column; align-items: center; justify-content: center;
background: rgba(0,0,0,0.92);
}
.mg-stage.is-playing .mg-overlay {
background: rgba(0,0,0,0.10);
}
#mg-start-btn {
padding: 16px 40px; font-size: 1.25rem; font-weight: 700; border-radius: 999px;
border: 1px solid #ba55d3; background: rgba(186,85,211,0.55); color: #fff; cursor: pointer;
}
.mg-start-pair {
display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; align-items: center;
pointer-events: auto;
}
.mg-start-pair button, .mg-start-pair .mg-start-btn {
padding: 14px 28px; font-size: 1.05rem; font-weight: 700; border-radius: 999px;
border: 1px solid #ba55d3; background: rgba(186,85,211,0.55); color: #fff; cursor: pointer;
box-shadow: 0 8px 28px rgba(0,0,0,0.45);
}
.mg-start-pair button.mg-start-new {
border-color: #69f0ae; background: rgba(105,240,174,0.28);
}
.mg-start-pair .mg-start-hint {
width: 100%; text-align: center; color: #ccc; font-size: 0.85rem; margin-top: 6px;
text-shadow: 0 1px 4px #000;
}
.qte-key {
display: inline-flex; align-items: center; justify-content: center;
width: 42px; height: 42px; margin: 0 5px; font-size: 20px; font-weight: bold;
background: linear-gradient(#ddd,#bbb); border: 2px solid #555; border-radius: 6px;
}
.qte-active-key { border-color: #00cbff; box-shadow: 0 0 12px rgba(0,203,255,0.8); }
.qte-success-key { background: linear-gradient(#00e676,#00b259); border-color: #00ff80; color: #fff; }
#stamina-timer { font-size: 1.3rem; font-weight: 700; color: #fff; text-shadow: 0 2px 6px #000; margin-bottom: 8px; display: none; }
.mg-skip-row { text-align: center; margin: 12px 0 8px; }
</style>
<div class="mg-stage" id="mg-stage">
<video class="bg-video" autoplay loop muted playsinline><source @src="$mg_BgVideo" type="video/webm"></video>
<div class="mg-overlay" id="qte-overlay">
<div id="stamina-countdown" style="display:none;font-size:4rem;font-weight:800;color:#fff;text-shadow:0 4px 16px #000;">3</div>
<div id="stamina-timer" style="display:none;">Time: <span id="stamina-clock">0.0</span>s</div>
<div id="qte-display" style="display:none;"></div>
<h4 id="stamina-message" style="color:#fff; text-shadow:1px 1px 2px #000; margin: 8px 0;">Choose a mini game</h4>
<div class="mg-start-pair">
<button type="button" id="mg-start-old">▶ Old mini game</button>
<button type="button" id="mg-start-new" class="mg-start-new">▶ New mini game</button>
<div class="mg-start-hint">Old = arrow key sequence · New = hold / breath stamina trial</div>
</div>
<button type="button" id="mg-start-btn" style="display:none;">▶ Start</button>
</div>
</div>
<div class="mg-skip-row">
<<set _ch to FT_skipChance($mg_Type, $mg_Difficulty || 1)>>
<<link `'⏭ Skip gamble (' + _ch + '% win)'`>>
<<run FT_skipCurrentMinigame()>>
<</link>>
</div>
<<script>>
$(document).one(':passagedisplay', function () {
const diff = State.variables.mg_Difficulty || 1;
const stat = State.variables.statStamina || 1;
const seqLength = Math.max(3, (2 + (diff * 2)) - Math.floor(stat / 3));
const timeLimit = Math.max(6, 14 - diff * 2 + Math.floor(stat / 2));
const keysMap = { ArrowUp: "⬆️", ArrowDown: "⬇️", ArrowLeft: "⬅️", ArrowRight: "➡️" };
const keyArray = Object.keys(keysMap);
let sequence = [], index = 0, isActive = false, started = false, startTs = 0, timerId = null;
const display = document.getElementById("qte-display");
const msg = document.getElementById("stamina-message");
const clock = document.getElementById("stamina-clock");
const timerWrap = document.getElementById("stamina-timer");
const startBtn = document.getElementById("mg-start-btn");
const stage = document.getElementById("mg-stage");
const overlay = document.getElementById("qte-overlay");
for (let i = 0; i < seqLength; i++) sequence.push(keyArray[Math.floor(Math.random() * keyArray.length)]);
// Countdown length scales with difficulty (harder = shorter ready time)
const countdownFrom = Math.max(1, 4 - diff); // diff1→3, diff2→2, diff3→1
function draw() {
if (!display) return;
display.innerHTML = "";
sequence.forEach((k, i) => {
const span = document.createElement("span");
span.innerText = keysMap[k];
span.className = "qte-key";
if (i < index) span.classList.add("qte-success-key");
else if (i === index && isActive) span.classList.add("qte-active-key");
display.appendChild(span);
});
}
function tick() {
if (!isActive) return;
const elapsed = (performance.now() - startTs) / 1000;
clock.textContent = elapsed.toFixed(1);
if (elapsed >= timeLimit) {
isActive = false;
clearInterval(timerId);
msg.innerText = "TIME UP!";
msg.style.color = "#ff1744";
State.variables.mg_Score = Math.max(10, Math.round((index / seqLength) * 55));
FT_finishMinigame(State.variables.mg_Score);
}
}
function begin() {
if (started) return;
started = true;
startBtn.style.display = "none";
if (stage) stage.classList.add("is-playing");
if (overlay) overlay.style.background = "rgba(0,0,0,0.10)";
msg.innerText = "Get ready...";
msg.style.color = "#fff";
const cdEl = document.getElementById("stamina-countdown");
let left = countdownFrom;
if (cdEl) {
cdEl.style.display = "block";
cdEl.textContent = String(left);
}
const cdTimer = setInterval(() => {
left--;
if (left > 0) {
if (cdEl) cdEl.textContent = String(left);
} else {
clearInterval(cdTimer);
if (cdEl) cdEl.style.display = "none";
// Reveal pattern only after countdown
if (display) display.style.display = "block";
if (timerWrap) timerWrap.style.display = "block";
msg.innerText = "Use Arrow Keys!";
isActive = true;
startTs = performance.now();
timerId = setInterval(tick, 50);
draw();
}
}, 1000);
}
if (startBtn) startBtn.addEventListener("click", begin);
var startOldStam = document.getElementById("mg-start-old");
var startNewStam = document.getElementById("mg-start-new");
if (startOldStam) startOldStam.addEventListener("click", begin);
if (startNewStam) {
startNewStam.addEventListener("click", function () {
State.variables.mg_ProductionLaunch = true;
State.variables.stTrialDiff = State.variables.mg_Difficulty || 1;
State.variables.stTrialVideo = State.variables.mg_BgVideo || "career/story/t4.webm";
if (!State.variables.stTrialMode) State.variables.stTrialMode = "hold";
Engine.play("Stamina Trial Play");
});
}
const handler = function (e) {
if (!isActive) return;
if (!keyArray.includes(e.key)) return;
e.preventDefault();
if (e.key === sequence[index]) {
index++;
draw();
if (index === sequence.length) {
isActive = false;
clearInterval(timerId);
const elapsed = (performance.now() - startTs) / 1000;
msg.innerText = "PERFECT!";
msg.style.color = "#00e676";
const speedBonus = Math.max(0, Math.round((timeLimit - elapsed) * 3));
State.variables.mg_Score = Math.min(100, 70 + speedBonus);
FT_finishMinigame(State.variables.mg_Score);
}
} else {
isActive = false;
clearInterval(timerId);
msg.innerText = "MISSTEP!";
msg.style.color = "#ff1744";
State.variables.mg_Score = Math.max(5, Math.round((index / seqLength) * 40));
FT_finishMinigame(State.variables.mg_Score);
}
};
document.addEventListener("keydown", handler);
$(document).one(':passagestart', () => {
document.removeEventListener("keydown", handler);
clearInterval(timerId);
});
});
<</script>><div class="passage-title">Your New Reality</div>
<div class="video-gallery"><video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:14px;box-shadow:0 8px 28px rgba(0,0,0,0.35);"><source src="career/pics/story/rebecca office.webm" type="video/webm"></video></div>
Rebecca doesn’t sit behind the desk. She leans against it, still flushed from the audition, already shifting fully into boss mode.
<<speech "rebecca">>Listen carefully. What you just did in there is only the entry fee. Talent gets you in the room. Surviving the schedule is what keeps you there.<</speech>>
<div class="story-img"><img src="career/pics/story/keycard_phone.jpg" alt="Keycard and phone" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<<speech "rebecca">>I’m putting you in a studio apartment I control. You live there. You work from there. When I call, you answer. In exchange I front the early costs — training already came out of my pocket. From this point on you pay me back with a weekly cut.<</speech>>
<<speech "you">>And if I miss a week?<</speech>>
<<speech "rebecca">>Then I collect another way. You’ll understand what that means if it ever happens.<</speech>>
<div class="panel">
<div class="panel-title">Systems unlocked</div>
<ul>
<li><b>Money</b> — every scene and side hustle pays. Miss the weekly debt and she collects another way.</li>
<li><b>Actions (3 per day)</b> — shoots, escort, training, recovery, talking to stars each cost one.</li>
<li><b>Exhaustion</b> — push too hard and you’re locked out of work for days.</li>
<li><b>City</b> — Joy Media first. Other studios open with reputation. Stars you work with can appear around town.</li>
</ul>
</div>
<<speech "rebecca">>You’re starting on the amateur gloryhole sets. Low pay. High volume. The kind of work that builds a name fast if you perform, and erases it just as fast if you don’t.<</speech>>
<<speech "you">>So the first jobs are basically proving I can show up and not fall apart on camera.<</speech>>
<<speech "rebecca">>Exactly. Perform well and people start asking for you by name. Perform badly and you’re just another body they forget by the next shoot.<</speech>>
<<speech "rebecca">>Keys are on the table. The apartment is yours starting tonight. Don’t make me regret putting money on you.<</speech>>
<div class="story-img"><img src="career/pics/loc/apartment_interior.jpg" alt="Starter apartment" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<<if $auditionTier === "high">>
<<set $money += 200>>
<<else>>
<<set $money += 120>>
<</if>>
<<set $debtActive to true>>
<<set $debt to 0>>
<<set $debtDaysLeft to 7>>
<<set $careerStarted to true>>
<<set $systemsUnlocked to true>>
<<set $careerDay to 0>>
<<set $forcedMorning to "">>
<<set $camUnlocked to true>>
<<set $onlyfansUnlocked to true>>
<<if $auditionTier === "high">>
<<set $camUnlocked to true>>
<</if>>
<<set $actionsLeft to $actionsMax>>
<<set $exhaustion to 0>>
<<set $mood to 8>>
<<set $didRecoveryToday to false>>
<<set $actionsUsedToday to 0>>
<<set $studioSameDayLock to false>>
<<set $swallowSameDayLock to false>>
<<set $initiationSameDayLock to false>>
<<set $secretsSameDayLock to false>>
<<set $escortSameDayLock to false>>
<<set $camSameDayLock to false>>
<div class="reward">Career systems online. Apartment secured. Weekly debt active.</div>
[[Enter your apartment|Bedroom Hub]]<<silently>>
<<if $systemsUnlocked and $forcedMorning>>
<<if $forcedMorning === "day3" and ($storyDay3Done or $sceneCompleted["ghx_nia"])>>
<<set $forcedMorning to "">>
<<set $storyDay3Done to true>>
<<elseif $forcedMorning === "day5" and ($storyDay5Done or $sceneCompleted["ghs_rebel"])>>
<<set $forcedMorning to "">>
<<set $storyDay5Done to true>>
<<elseif $forcedMorning === "day7" and ($storyDay7Done or $sceneCompleted["ghs_rebel2"])>>
<<set $forcedMorning to "">>
<<set $storyDay7Done to true>>
<<elseif $forcedMorning === "day8">>
<<set $forcedMorning to "">>
<<set $storyDay8Done to true>>
<<elseif $forcedMorning === "day9" and $storyDay9Done>>
<<set $forcedMorning to "">>
<<elseif $forcedMorning === "day11" and $storyDay11Done>>
<<set $forcedMorning to "">>
<</if>>
<</if>>
<</silently>>
<<if $systemsUnlocked and $forcedMorning>>
<<goto "Story Forced Morning">>
<</if>>
<div class="passage-title">$playerName’s Place</div>
<<if $systemsUnlocked>>
<<checkVersionEnd>>
<div class="story-img"><img src="career/pics/loc/bedroom_hub.jpg" alt="Bedroom hub" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
The room is quiet. Soft light filters through the curtains.
<<if $careerDay>>
<div class="hint">Career day <b>$careerDay</b></div>
<</if>>
<<if $versionEndReady and not $versionEndSeen>>
<div class="panel" style="border-color:rgba(186,85,211,0.55);">
<div class="panel-title">You’ve gone far this version</div>
Every studio scene, escort story (except the cuckold path), and cam show is in the can.
<div class="nav-grid">[[See the wrap note|Version Complete]]</div>
</div>
<<elseif $versionEndSeen>>
<div class="hint">[[Version note / support|Version Complete]]</div>
<</if>>
<<if $husbandMeetPending and not $husbandMeetDone>>
<div class="panel panel-tight">
<div class="panel-title">Pending</div>
Rebel’s husband wants to meet you for a drink.
<div class="nav-grid">[[Meet Rebel’s husband|Rebel Cuckold Pitch 2]]</div>
</div>
<</if>>
<div class="nav-grid">
[[Go Out|City]]
<<if $camUnlocked>>
[[Cam from the bedroom|Cam Setup]]
<</if>>
[[Sleep|Sleep Sequence]]
</div>
<<else>>
<div class="story-img"><img src="career/pics/loc/temp_room.jpg" alt="Temp room" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
You’re still in the temporary room. Until Rebecca signs off on your career, this is just a place to sleep and train.
<div class="nav-grid">
[[Sleep|Sleep Sequence]]
[[Go to Training Grounds|Training Grounds]]
</div>
<<if $statFocus >= 2 and $statTechnique >= 2 and $statStamina >= 2>>
<div class="panel">
<div class="panel-title">Ready</div>
[[Contact Rebecca (Final Audition)|Audition A - Rebecca]]
</div>
<<else>>
<div class="panel">
<div class="panel-title">Training required</div>
<span class="hint">Raise Focus, Technique, and Stamina to 2 with Raya.</span><br>
Focus <b>$statFocus</b> · Technique <b>$statTechnique</b> · Stamina <b>$statStamina</b>
</div>
<</if>>
<</if>><div class="passage-title">Debt deadline</div>
Your phone lights up the second you wake. Rebecca.
<<speech "rebecca">>Time’s up. You owe me $<<print $debtWeekly>> this week.<</speech>>
<<if $money >= $debtWeekly>>
<<speech "you">>I’ve got it.<</speech>>
<<speech "rebecca">>Then pay it. Now.<</speech>>
[[Pay her|Pay Debt]]
<<else>>
<<speech "you">>I don’t have it.<</speech>>
<<speech "rebecca">>Then you’re coming to my place. Door’s unlocked. Don’t make me wait.<</speech>>
She hangs up.
[[Go|Debt Consequence]]
<</if>><<silently>>
<<set _weekDue to Number($debtWeekly) || 1500>>
<<set _paidExtra to 0>>
<<set _paidOk to false>>
<<if $money >= _weekDue>>
<<set $money -= _weekDue>>
<<if $money > 0 and $debt > 0>>
<<set _extra to Math.min($money, $debt)>>
<<set $debt -= _extra>>
<<set $money -= _extra>>
<<set _paidExtra to _extra>>
<</if>>
<<set _paidOk to true>>
<<set $rebeccaRelation to ($rebeccaRelation || 0) + 5>>
<<else>>
<<set _had to Number($money) || 0>>
<<set _remain to Math.max(0, _weekDue - _had)>>
<<set $debt to (Number($debt) || 0) + _remain>>
<<set $money to 0>>
<<set _paidOk to false>>
<<set $debtShortfallApplied to true>>
<</if>>
<<set $debtDaysLeft to 7>>
<<set $pendingRebeccaVisit to false>>
<</silently>>
<<if _paidOk>>
<<speech "rebecca">>Good. We’re clear for this week.<</speech>>
<<if _paidExtra > 0>>
<div class="hint">Extra went on the principal. Debt left: $<<print $debt>>.</div>
<<else>>
<div class="hint">Still on the books: $<<print $debt>>. Next week: $<<print $debtWeekly>>.</div>
<</if>>
[[Return to Bedroom|Bedroom Hub]]
<<else>>
/* Shouldn’t happen from Deadline when money was enough; route to consequence */
<<goto "Debt Consequence">>
<</if>><<silently>>
<<if ndef $debtShortfallApplied>>
<<set _weekDue to Number($debtWeekly) || 1500>>
<<set _had to Number($money) || 0>>
<<set $debt to (Number($debt) || 0) + Math.max(0, _weekDue - _had)>>
<<set $money to 0>>
<</if>>
<<unset $debtShortfallApplied>>
<<set $debtDaysLeft to 7>>
<<set $rebeccaRelation to ($rebeccaRelation || 0) - 10>>
<<set $pendingRebeccaVisit to false>>
/* action cost for forced debt scene */
<<if $actionsLeft > 0>>
<<set $actionsLeft -= 1>>
<<set $actionsUsedToday to Math.min($actionsMax, ($actionsUsedToday || 0) + 1)>>
<</if>>
<<if $chats>>
<<for _c range $chats>>
<<if _c.id === "rebecca">><<set _c.action to null>><</if>>
<<if _c.id === "rebel">><<set _c.action to null>><</if>>
<</for>>
<</if>>
/* pick next debt scene */
<<if not $sceneCompleted["debt_week1"]>>
<<set _debtScene to "Scene debt_week1">>
<<elseif not $sceneCompleted["debt_week2"]>>
<<set _debtScene to "Scene debt_week2">>
<<elseif $unlockedCuckoldEscort>>
<<set _debtScene to "Forced Scene - Cuck">>
<<else>>
<<set _debtScene to "Forced Scene - Soft Femdom">>
<</if>>
<</silently>>
<div class="passage-title">Her place</div>
<div class="video-gallery"><video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:14px;box-shadow:0 8px 28px rgba(0,0,0,0.35);"><source src="career/pics/story/rebecca office.webm" type="video/webm"></video></div>
The door is unlocked, same as she said. She’s already inside.
<<speech "rebecca">>You don’t have the money. So we do this my way.<</speech>>
<<link "Continue">>
<<goto _debtScene>>
<</link>><<silently>>
<<set _fm to $forcedMorning>>
<</silently>>
<div class="passage-title">Incoming call</div>
<<if _fm === "day3" and ($storyDay3Done or $sceneCompleted["ghx_nia"])>>
<<set $forcedMorning to "">>
<<goto "Story Day3 After Nia">>
<<elseif _fm === "day3">>
Your phone vibrates against the nightstand. Rebecca.
<<speech "rebecca">>$playerName. Joy Media. One hour. Don’t be late.<</speech>>
<<speech "you">>What’s the set?<</speech>>
<<speech "rebecca">>You’ll see when you get here. Move.<</speech>>
She hangs up before you can ask anything else.
[[Go to Joy Media|Story Day3 Studio]]
<<elseif _fm === "day5">>
Rebecca. Same clipped tone.
<<speech "rebecca">>Studio. This morning. You’re on the sheet.<</speech>>
<<speech "you">>Can I get—<</speech>>
<<speech "rebecca">>No. Be there.<</speech>>
[[Go to Joy Media|Story Day5 Studio]]
<<elseif _fm === "day7">>
Rebel’s name on the screen.
<<speech "rebel" "Rebel Rhyder">>You free this morning?<</speech>>
<<speech "you">>Depends.<</speech>>
<<speech "rebel" "Rebel Rhyder">>Same building as last time. I’m already here. Come through.<</speech>>
[[Go to the set|Scene ghs_rebel2][$phase to 0;$sceneId to "ghs_rebel2";$mg_Returning to false]]
<<elseif _fm === "day8">>
<<set $forcedMorning to "">>
<<set $storyDay8Done to true>>
[[Bedroom|Bedroom Hub]]
<<elseif _fm === "day9">>
Nia’s name on the screen.
<<speech "nia" "Nia Nacci">>You up?<</speech>>
<<speech "you">>Yeah?<</speech>>
<<speech "nia" "Nia Nacci">>Not a shoot. Two minutes. Don’t make me do this over a lobby speaker.<</speech>>
[[Take the call|Story Day9 Nia Call]]
<<elseif _fm === "day11">>
Nia again. No small talk this time.
<<speech "nia" "Nia Nacci">>They’re ready. Dogfart. Today.<</speech>>
<<speech "you">>Now?<</speech>>
<<speech "nia" "Nia Nacci">>Now. I put my name on you. Don’t be late and don’t make me look stupid.<</speech>>
[[Go to Dogfart|Story Day11 Dogfart]]
<<else>>
<<set $forcedMorning to "">>
[[Bedroom|Bedroom Hub]]
<</if>><<if $storyDay3Done or $sceneCompleted["ghx_nia"]>>
<<set $forcedMorning to "">>
<<set $storyDay3Done to true>>
<<goto "Story Day3 After Nia">>
<</if>>
<div class="passage-title">Joy Media</div>
<div class="story-img"><img src="career/pics/loc/gloryhole_secrets.jpg" alt="Secrets set" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
Rebecca doesn’t greet you in the lobby. She just tips her head toward the pro wing and starts walking.
<<speech "rebecca">>This way.<</speech>>
<<speech "you">>What’s the job?<</speech>>
<<speech "rebecca">>Booth. She’s already set. Do your job and we’ll talk after.<</speech>>
[[Start the scene|Scene ghx_nia][$phase to 0;$sceneId to "ghx_nia";$mg_Returning to false]]<<silently>>
<<unset $phase>>
<<set $mg_Returning to false>>
<</silently>>
<div class="passage-title">After the set</div>
<div class="video-gallery"><video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:14px;box-shadow:0 8px 28px rgba(0,0,0,0.35);"><source src="career/pics/story/rebecca office.webm" type="video/webm"></video></div>
Rebecca is in the hallway when you come out, scrolling something on her phone. She doesn’t look up right away.
<<speech "rebecca">>You held it together.<</speech>>
<<speech "you">>That all?<</speech>>
<<speech "rebecca">>For a first time on that floor? Yes. I’m putting Secrets on your rotation. Swallow’s still there if you want the easy bookings — but you can take pro booths when they open.<</speech>>
<<speech "you">>Alright.<</speech>>
<<speech "rebecca">>Don’t get cocky. One good set doesn’t mean anything if the next one tanks. Go home.<</speech>>
<<silently>>
<<set $unlockedGloryholeSecrets to true>>
<<set $storyDay3Done to true>>
<<set $forcedMorning to "">>
<<set $secretsIndex to 0>>
<</silently>>
<div class="nav-grid">[[Home|Bedroom Hub]]</div><div class="passage-title">Joy Media</div>
<div class="story-img"><img src="career/pics/loc/gloryhole_swallow.jpg" alt="Swallow set" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
Rebecca stops you outside a booth and knocks once on the partition.
<<speech "rebecca">>You’re up. Don’t overthink it.<</speech>>
She leaves before the door finishes opening.
[[Start the scene|Scene ghs_rebel][$phase to 0;$sceneId to "ghs_rebel";$mg_Returning to false]]<<silently>>
<<unset $phase>>
<<set $mg_Returning to false>>
<</silently>>
<div class="passage-title">After the set</div>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:14px;box-shadow:0 8px 28px rgba(0,0,0,0.35);"><source src="career/pics/story/rebel post 1st.webm" type="video/webm"></video>
</div>
Rebel steps out of the booth still a little flushed, wiping the corner of her mouth. Lulu follows close behind her, hair messy, looking like she’s still processing everything that just happened.
<<speech "rebel">>You’re the one who finished inside me.<</speech>>
<<speech "you">>Yeah… that was me.<</speech>>
<<speech "rebel">>Most of the guys on that wall either pull out the second they get close or can’t keep it together once the room gets loud. You actually stayed in me and filled me up while the rest of the set was chaos.<</speech>>
<<speech "lulu">>I was trying not to look… but it was hard not to notice.<</speech>>
<<speech "rebel">>She was nervous the whole time. You weren’t. That’s the difference.<</speech>>
Rebel glances at Lulu, then back at you.
<<speech "rebel">>Look — if we book again and I’m the one choosing who ends up on the other side of the wall, I might ask for you. No promises. But that load didn’t go unnoticed, and neither did the fact that you didn’t fold the second things got intense.<</speech>>
<<speech "you">>Alright. I’ll… be around.<</speech>>
<<speech "rebel">>Alright. Go shower. You still smell like me.<</speech>>
She turns and starts walking off with Lulu still trailing behind her, already talking about the next shoot.
<<silently>>
<<set $storyDay5Done to true>>
<<set $forcedMorning to "">>
<</silently>>
<div class="nav-grid">[[Home|Bedroom Hub]]</div><<silently>>
<<unset $phase>>
<<set $mg_Returning to false>>
<</silently>>
<div class="passage-title">After the set</div>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:14px;box-shadow:0 8px 28px rgba(0,0,0,0.35);"><source src="career/pics/story/rebel post 2nd.webm" type="video/webm"></video>
</div>
Rebel leans on the wall, scrolling her phone. She glances up when she hears you.
<<speech "rebel">>Second time’s less awkward.<</speech>>
<<speech "you">>You called me in specifically.<</speech>>
<<speech "rebel">>Yeah. My husband was watching today. Through the glass. He does that sometimes.<</speech>>
She studies your face for a reaction and seems satisfied you don’t flinch.
<<speech "rebel">>He saw you finish in my ass. Heard me say I was taking it home for him. He wants to meet you. Just a drink. He’s not… weird about it. He’s the one who liked what he saw.<</speech>>
<<speech "you">>And if I say no?<</speech>>
<<speech "rebel">>Then you say no. I’m not dragging you. But if you come by the apartment later, he’ll be around. Your call.<</speech>>
<<silently>>
<<set $storyDay7Done to true>>
<<set $forcedMorning to "">>
<<set $husbandMeetPending to true>>
<</silently>>
<div class="nav-grid">[[Home|Bedroom Hub]]</div><<goto "Story Day9 Nia Call">><div class="passage-title">Nia’s call</div>
<div class="story-img"><img src="career/pics/loc/city_night.jpg" alt="Phone call" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);" onerror="this.style.display='none'"></div>
You take it in the kitchen. No studio noise on her end — just her, low and direct.
<<speech "nia" "Nia Nacci">>That Joy Media booth. That was you.<</speech>>
<<speech "you">>Yeah. That was me.<</speech>>
<<speech "nia" "Nia Nacci">>I don’t usually call booth talent. I called because you didn’t fold.<</speech>>
<<speech "you">>Okay…<</speech>>
<<speech "nia" "Nia Nacci">>I’ve got something with Dogfart. Different floor. They’re picky. I think you’d fit. I’m not promising a booking — I’m saying I can put your name in front of them.<</speech>>
<<speech "you">>I’d take that.<</speech>>
<<speech "nia" "Nia Nacci">>Good. When they want you on their floor, I’ll call. Don’t disappear, and don’t make me look stupid.<</speech>>
She hangs up before you can thank her.
<<silently>>
<<set $storyDay8Done to true>>
<<set $storyDay9Done to true>>
<<set $forcedMorning to "">>
<<set $niaCallDone to true>>
<<set $unlockedDogfart to true>>
<</silently>>
<div class="nav-grid">[[Home|Bedroom Hub]]</div><<goto "Story Day9 Nia Call">><<goto "Story Day3 After Nia">><<silently>>
<<unset $phase>>
<<set $mg_Returning to false>>
<</silently>>
<div class="passage-title">After the set</div>
<div class="story-img"><img src="career/pics/loc/joy_media_lobby.jpg" alt="Lobby" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
Nia catches up with you near the exit, phone in one hand, robe tied loose.
<<if $lastScore >= 65>>
<<speech "nia" "Nia Nacci">>Hey. Wait up a second.<</speech>>
<<speech "you">>Yeah?<</speech>>
<<speech "nia" "Nia Nacci">>That was solid. I don’t usually say that after a booth.<</speech>>
She hesitates, then tips her phone toward you like she’s already typing.
<<speech "nia" "Nia Nacci">>I’ve got people at another studio — Dogfart. They’re picky. I can put your name in front of them if you want. No pressure. Just… you earned the mention.<</speech>>
<<speech "you">>I’d take that.<</speech>>
<<speech "nia" "Nia Nacci">>Cool. I’ll send it. When they want you on their floor, I’ll call. Don’t disappear, and don’t make me look stupid.<</speech>>
<<silently>>
<<set $unlockedDogfart to true>>
<</silently>>
<<else>>
<<speech "nia" "Nia Nacci">>Hey.<</speech>>
<<speech "you">>Hey.<</speech>>
<<speech "nia" "Nia Nacci">>You showed up. That’s fine. Work on lasting next time if we cross paths again.<</speech>>
<<speech "you">>Yeah. Thanks for the set.<</speech>>
<<speech "nia" "Nia Nacci">>Mm. See you around.<</speech>>
<</if>>
<<silently>>
<<set $storyDay9Done to true>>
<<set $forcedMorning to "">>
<</silently>>
<div class="nav-grid">[[City|City]] [[Home|Bedroom Hub]]</div><div class="passage-title">Dogfart</div>
<div class="story-img"><img src="career/pics/loc/joy_media_lobby.jpg" alt="Dogfart lobby" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);" onerror="this.style.display='none'"></div>
The building is louder than Joy Media. Different posters. Different smell. Nia is already in the lobby, sunglasses still on, like she walked you in on purpose.
<<speech "nia" "Nia Nacci">>You made it. Good. I told them the Initiation kid could last and that the Joy Media booth wasn’t a fluke.<</speech>>
<<speech "you">>This is Dogfart.<</speech>>
<<speech "nia" "Nia Nacci">>This is the floor I wouldn’t name on the phone. Interracial, picky, and they eat new white boys who choke. I put my name on you. Don’t waste that.<</speech>>
A PA waves her toward a hallway. This time she follows — and she takes you with her.
<<speech "nia" "Nia Nacci">>Today you shoot. Gloryhole floor. My name is on the slate next to yours. When they book you after this, it won’t feel like Joy Media. You’ll know.<</speech>>
<<speech "you">>And you?<</speech>>
<<speech "nia" "Nia Nacci">>I’m the reason you’re standing here. Act like it.<</speech>>
She walks you past the desk, says your name once, and pushes the booth door with two fingers.
<<silently>>
<<set $storyDay11Done to true>>
<<set $forcedMorning to "">>
<<set $visitedDogfart to true>>
<<set $unlockedDogfart to true>>
<<set $unlockedGloryholeInitiation to true>>
<<set $studioRelation["dogfart"] to Math.max($studioRelation["dogfart"] || 0, 8)>>
<<set $sceneId to "ghi_nia">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<</silently>>
<<if $sceneCompleted["ghi_nia"]>>
The booth she used on you is already struck. The floor manager nods you toward the board.
<div class="nav-grid">[[Look around|Dogfart Studios]] [[City|City]] [[Home|Bedroom Hub]]</div>
<<else>>
[[Follow her into the booth|Scene ghi_nia]]
<</if>><div class="passage-title">Dogfart Studios</div>
<div class="story-img"><img src="career/pics/loc/joy_media_lobby.jpg" alt="Dogfart" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);" onerror="this.style.display='none'"></div>
<<if not $unlockedDogfart>>
The desk doesn’t know your name yet.
[[Back to City|City]]
<<elseif $exhaustionLocked>>
Too exhausted to work.
[[Back to City|City]]
<<else>>
<<if not $storyDay11Done and not $sceneCompleted["ghi_nia"]>>
Nia opened this door. The first slate is her booth — and she wants to walk you in herself.
<<if $careerDay >= 11>>
<div class="hint">She’s in the lobby. Today is the shoot, not paperwork.</div>
<div class="nav-grid">[[Walk in with Nia|Story Day11 Dogfart]] [[Leave|City]]</div>
<<else>>
<div class="hint">Unlocked. Waiting on Nia’s call before the first Dogfart gloryhole slate goes up.</div>
<div class="nav-grid">[[Leave|City]]</div>
<</if>>
<<else>>
Nia walked you in. The gloryhole floor is live — one booking at a time, same pattern as Secrets.
<<if $studioSameDayLock>>
<div class="hint">Already shot for a studio today. Sleep to book another.</div>
<</if>>
<div class="panel">
<div class="panel-title">Available sites</div>
<div class="loc-card">[[Gloryhole Initiation|Gloryhole Initiation]]</div>
</div>
<div class="nav-grid">[[Leave|City]]</div>
<</if>>
<</if>><<set $pendingRebeccaVisit to false>>
<<silently>>
<<if $chats>>
<<for _c range $chats>>
<<if _c.id === "rebecca">><<set _c.action to null>><</if>>
<</for>>
<</if>>
<<if $actionsLeft > 0>>
<<set $actionsLeft -= 1>>
<<set $actionsUsedToday to Math.min($actionsMax, ($actionsUsedToday || 0) + 1)>>
<</if>>
<</silently>>
<div class="passage-title">Rebecca’s place</div>
She opens the door herself. No small talk.
<<speech "rebecca">>You didn’t pay. So we settle it like this.<</speech>>
<<if not $sceneCompleted["debt_week1"]>>
[[Accept the lesson|Scene debt_week1]]
<<elseif not $sceneCompleted["debt_week2"]>>
[[Second week consequences|Scene debt_week2]]
<<else>>
[[Soft Femdom session|Forced Scene - Soft Femdom]]
<<if $unlockedCuckoldEscort>>
[[Cuckold lesson|Forced Scene - Cuck]]
<</if>>
<</if>><div class="passage-title">Forced – Soft Femdom</div>
<<set $debtFailCount += 1>>
Rebecca points to the floor beside the couch.
<<speech "rebecca">>Kneel. Hands behind your back. You’re not directing anything tonight.<</speech>>
You obey. She walks a slow circle around you, robe half open, fingers in your hair when she wants eye contact.
<<speech "rebecca">>I funded your start. You spent the week and brought me nothing. So tonight you pay with obedience.<</speech>>
<<speech "you">>…Yes.<</speech>>
She edges you with deliberate patience — mouth, hands, stopping the second your breath changes. A lecture between every pause: how studios work, how reputation dies, how easy it is to replace booth talent.
When she finally lets you finish, it’s on your knees, looking up, while she decides you’re done.
<<if $debtFailCount >= 3>>
<<speech "rebecca">>Third time. Next failure won’t be private.<</speech>>
<<else>>
<<speech "rebecca">>Next week, have the cash. Or we do this again — and I’ll invite an audience.<</speech>>
<</if>>
<<silently>>
<<set $exhaustion to Math.min($exhaustionMax, $exhaustion + 1)>>
<<set $mood to Math.max(0, $mood - 1)>>
<<set $rebeccaRelation to ($rebeccaRelation || 0) + 2>>
<<applyWorkLoad "studio" "bad">>
<</silently>>
<div class="hint">Forced settlement · −1 action · Fail count: $debtFailCount</div>
[[Return Home|Bedroom Hub]]<div class="passage-title">Forced – Cuckold Lesson</div>
<<if not $unlockedCuckoldEscort>>
[[Continue|Forced Scene - Soft Femdom]]
<<else>>
<<set $debtFailCount += 1>>
Rebecca has company already on the couch — a confident male performer she doesn’t bother introducing.
<<speech "rebecca">>Sit. Watch. Don’t touch him, don’t touch me, don’t touch yourself until I say.<</speech>>
She performs with him while making sure you never look away. When your jaw tightens she smiles. When it’s over she leaves you hard and dismissed at the door.
<<speech "rebecca">>That’s the business. Either you earn the role… or you hold the coat.<</speech>>
<<silently>>
<<applyWorkLoad "studio" "bad">>
<<set $expCuckold += 1>>
<<set $rebeccaRelation to ($rebeccaRelation || 0) + 1>>
<</silently>>
<div class="hint">Forced settlement · −1 action · Cuckold exp +1 · Fail count: $debtFailCount</div>
[[Return Home|Bedroom Hub]]
<</if>><<goto "Bedroom Hub">>
<div class="passage-title">Phone</div>
<div class="story-img"><img src="career/pics/story/phone_home.jpg" alt="Phone home" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
Your phone lights up.
<div style="display:flex; flex-wrap:wrap; gap:16px; margin: 20px 0;">
<div style="text-align:center; width:100px;">
[[💬 Messages|Phone - Messages]]
<<if $unreadChats > 0>><br><small style="color:#00cbff;">$unreadChats new</small><</if>>
</div>
<div style="text-align:center; width:100px;">
<<if $camUnlocked>>
[[Cam|Cam Setup]]
<<else>>
Cam<br><small>(Locked)</small>
<</if>>
</div>
<div style="text-align:center; width:100px;">
[[Rankings|Phone - Rankings]]
</div>
</div>
<<if $pendingRebeccaVisit>>
<div class="panel danger">Rebecca expects you at her place.</div>
<</if>>
[[Back to Bedroom|Bedroom Hub]]<div class="passage-title">Messages</div>
<<if ndef $chats or !$chats or $chats.length === 0>>
<div class="hint">No conversations yet. People will text when something needs your attention.</div>
<<else>>
<<for _c range $chats>>
<div class="loc-card" style="<<if _c.unread>>border-color:#00cbff;<</if>>">
<b><<print _c.name>></b>
<<if _c.unread>> <span class="stat-info">· <<print _c.unread>> new</span><</if>>
<br>
<span class="hint"><<print (_c.messages.length ? _c.messages[_c.messages.length - 1].text.slice(0, 80) : "")>></span>
<br>
[[Open|Phone - Chat][$activeChatId to _c.id]]
</div>
<</for>>
<</if>>
<div class="nav-grid">[[Back to Phone|Phone]]</div><<set _thread to null>>
<<for _c range $chats>>
<<if _c.id === $activeChatId>>
<<set _thread to _c>>
<</if>>
<</for>>
<<if not _thread>>
Thread not found.
[[Messages|Phone - Messages]]
<<else>>
<div class="passage-title"><<print _thread.name>></div>
<<if _thread.unread>>
<<set $unreadChats to Math.max(0, $unreadChats - _thread.unread)>>
<<set _thread.unread to 0>>
<</if>>
<div class="panel" style="max-height: 50vh; overflow:auto;">
<<for _m range _thread.messages>>
<div style="margin: 10px 0; padding: 10px 12px; border-radius: 12px; background: rgba(255,255,255,0.05);">
<b style="color:#ce93d8;"><<print _thread.name>></b>
<div><<print _m.text>></div>
</div>
<</for>>
</div>
<<if _thread.id === "rebecca" and $pendingRebeccaVisit>>
<div class="nav-grid">
[[Go to Rebecca’s apartment|Forced Scene Hub]]
</div>
<</if>>
<<if _thread.id === "rebel" and not $rebelVisit2Done and ($rebelVisit2Ready or Number($pendingRebelMeet) === 2)>>
<<silently>>
<<set $pendingRebelMeet to 2>>
<<set $rebelVisit2Ready to true>>
<</silently>>
<div class="nav-grid">
[[Meet Rebel & her husband|Rebel Cuckold Pitch 2]]
</div>
<</if>>
<div class="nav-grid">
[[Back to Messages|Phone - Messages]]
[[Phone|Phone]]
<<if $pendingRebeccaVisit and _thread.id !== "rebecca">>
[[Rebecca’s House|Forced Scene Hub]]
<</if>>
</div>
<</if>><<goto "Phone">><<goto "Phone">># OnlyFans
<<if not $onlyfansUnlocked>>
You need more popularity before you can start an OnlyFans.
[[Back to Phone|Phone]]
<<else>>
Fans: $onlyfansFans<br>
Rank: $rankOnlyFans<br>
Lifetime income: $$onlyfansIncome
*(Placeholder – post content / collect tips later)*
[[Back to Phone|Phone]]
<</if>><<goto "Cam Setup">># Rankings
**Current Standing**
- Porn Sites: $rankPornSites
- OnlyFans: $rankOnlyFans
- Cam: $rankCam
- Escort Agencies: $rankEscort
**Studio Reputation (Overall):** $overallStudioRep
**Scene Experience**
- Gloryhole: $expGloryhole
- Gangbang: $expGangbang
- Orgy: $expOrgy
- Threesome: $expThreesome
- Cuckold: $expCuckold
- Rough: $expRough
- BDSM: $expBDSM
[[Back to Phone|Phone]]
[[Back to Bedroom|Bedroom Hub]]<<goto "Bedroom Hub">>
<div class="passage-title">Performance checks</div>
<div class="panel">
<<checkbox "$skipMinigames" false true>> Skip performance checks
<div class="hint" style="margin-top:8px;">When this is on, every scene only shows Continue.</div>
</div>
<div class="nav-grid">[[Back|Bedroom Hub]]</div><<silently>>
<<checkVersionEnd>>
<<if ndef $cityStars or $cityStars is null>><<set $cityStars to []>><</if>>
<<if $overallStudioRep >= 40 and not $unlockedBrazzers>><<set $unlockedBrazzers to true>><</if>>
<<if $overallStudioRep >= 60 and not $unlockedDeeper>><<set $unlockedDeeper to true>><</if>>
<</silently>>
<div class="passage-title">City</div>
<<if $versionEndReady and not $versionEndSeen>>
<div class="panel panel-tight"><div class="panel-title">Version content complete</div>[[Read the end-of-version note|Version Complete]]</div>
<</if>>
<div class="story-img story-img-tight"><img src="career/pics/loc/city_night.jpg" alt="City strip"></div>
<p class="city-lead">You step out into the city. <span class="hint">Actions <b>$actionsLeft / $actionsMax</b></span></p>
<<if $exhaustionLocked>>
<div class="danger">Too exhausted to work. Recover first. ($exhaustionLockDays days left)</div>
<</if>>
<div class="city-section-label">Work</div>
<div class="city-grid">\
<<if not $exhaustionLocked>>\
<a class="city-card is-ph link-internal" data-passage="Joy Media Studios" style="background-image:url('career/pics/city/btn_joy_media.jpg')"><span>Joy Media</span></a>\
<</if>>\
<<if $unlockedDogfart>>\
<a class="city-card is-ph link-internal" data-passage="Dogfart Studios" style="background-image:url('career/pics/city/btn_dogfart.jpg')"><span>Dogfart</span></a>\
<<if $unlockedBrazzers>>\
<a class="city-card is-ph link-internal" data-passage="Brazzers Studios" style="background-image:url('career/pics/city/btn_brazzers.jpg')"><span>Brazzers</span></a>\
<<else>>\
<span class="city-card is-ph is-locked" style="background-image:url('career/pics/city/btn_brazzers.jpg')"><span>Brazzers</span></span>\
<</if>>\
<<if $unlockedDeeper>>\
<a class="city-card is-ph link-internal" data-passage="Deeper Studios" style="background-image:url('career/pics/city/btn_deeper.jpg')"><span>Deeper</span></a>\
<<else>>\
<span class="city-card is-ph is-locked" style="background-image:url('career/pics/city/btn_deeper.jpg')"><span>Deeper</span></span>\
<</if>>\
<</if>>\
<<if $pendingRebeccaVisit>>\
<a class="city-card is-ph link-internal alert" data-passage="Forced Scene Hub" style="background-image:url('career/pics/city/btn_rebecca_house.jpg')"><span>Rebecca’s House</span></a>\
<</if>>\
<a class="city-card is-ph link-internal" data-passage="Escort Agency" style="background-image:url('career/pics/city/btn_escort.jpg')"><span>Escort Agency</span></a>\
</div>
<div class="city-section-label">City</div>
<div class="city-grid">\
<a class="city-card is-ph link-internal" data-passage="Park" style="background-image:url('career/pics/city/btn_park.jpg')"><span>Park</span></a>\
<a class="city-card is-ph link-internal" data-passage="Mall" style="background-image:url('career/pics/city/btn_mall.jpg')"><span>Mall</span></a>\
<a class="city-card is-ph link-internal" data-passage="Gym" style="background-image:url('career/pics/city/btn_gym.jpg')"><span>Gym</span></a>\
<a class="city-card is-ph link-internal" data-passage="Cafe" style="background-image:url('career/pics/city/btn_cafe.jpg')"><span>Cafe</span></a>\
<a class="city-card is-ph link-internal" data-passage="Bedroom Hub" style="background-image:url('career/pics/city/btn_home.jpg')"><span>Home</span></a>\
</div><div class="passage-title">Joy Media Studios</div>
<div class="story-img"><img src="career/pics/loc/joy_media_lobby.jpg" alt="Joy Media lobby" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
You arrive at Joy Media — Rebecca’s company.
<<if $exhaustionLocked>>
<span class="danger">Too exhausted to work.</span>
<div class="nav-grid">[[Return to City|City]]</div>
<<elseif $studioSameDayLock>>
<span class="hint">You already did a studio shoot today. Sleep to book another.</span>
<div class="nav-grid">[[Return to City|City]] [[Bedroom|Bedroom Hub]]</div>
<<else>>
The lobby is modern and professional. A receptionist looks up at you.
<<if $debtActive>>
<<speech "rebecca">>Start with group scenes. Low pay, high exposure. Build the name first.<</speech>>
<</if>>
<div class="panel">
<div class="panel-title">Available sites</div>
<div class="loc-card">[[Gloryhole Swallow (Amateur)|Gloryhole Swallow]]</div>
<<if $unlockedGloryholeSecrets>>
<div class="loc-card">[[Gloryhole Secrets (Pro)|Gloryhole Secrets]]</div>
<<else>>
<div class="locked">Gloryhole Secrets (Pro) — locked until more amateur sessions</div>
<</if>>
</div>
<div class="nav-grid">[[Leave|City]]</div>
<</if>><<silently>>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<<unset $mg_Score1>>
<</silently>>
<div class="passage-title">Gloryhole Swallow</div>
<div class="story-img"><img src="career/pics/loc/gloryhole_swallow.jpg" alt="Gloryhole Swallow set" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
Amateur site under Joy Media. Actions: <b>$actionsLeft / $actionsMax</b>
<<if $exhaustionLocked>>
Too exhausted to work.
[[Back to Joy Media|Joy Media Studios]]
<<elseif $actionsLeft < 1>>
No actions left today. Sleep to continue.
[[Back to Joy Media|Joy Media Studios]]
[[Go Home|Bedroom Hub]]
<<elseif $studioSameDayLock>>
Already shot for a studio today. One Joy Media shoot per day.
[[Back to Joy Media|Joy Media Studios]]
[[Go Home|Bedroom Hub]]
<<else>>
<<set $swallowOrder to ["ghs_catherine","ghs_luna","ghs_courtney","ghs_nikki","ghs_emma","ghs_chantell","ghs_yaya","ghs_indica"]>>
<<set $swallowNames to {
"ghs_catherine": "Catherine",
"ghs_luna": "Luna Lovesit",
"ghs_courtney": "Courtney Loxx & Kristina",
"ghs_nikki": "Nikki Nicole",
"ghs_rebel": "Rebel Rhyder & Lulu",
"ghs_emma": "Eskimo Emma & Friend",
"ghs_chantell": "Chantell & Annabeth",
"ghs_yaya": "Yaya & Faith",
"ghs_indica": "Indica Monroe & Italy",
"ghs_rebel2": "Rebel Rhyder & Lulu (2)"
}>>
<<set $swallowPortraits to {
"ghs_catherine": "career/pics/avatars/cathrine.jpeg",
"ghs_luna": "career/pics/avatars/luna.jpeg",
"ghs_courtney": "career/pics/avatars/courtney.jpeg",
"ghs_nikki": "career/pics/avatars/nikki.jpg",
"ghs_emma": "career/pics/avatars/Emma.jpg",
"ghs_chantell": "career/pics/avatars/chantell.jpg",
"ghs_yaya": "career/pics/avatars/yaya.webp",
"ghs_indica": "career/pics/avatars/Indica.jpeg",
"ghs_rebel": "career/pics/avatars/rebel.jpg",
"ghs_rebel2": "career/pics/avatars/rebel.jpg"
}>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<div class="panel panel-tight">
<div class="panel-title">Session queue</div>
<<if $swallowSameDayLock or $studioSameDayLock>>
<span class="hint">You already shot a studio scene today. Sleep to unlock the next one.</span>
<<else>>
<<if $swallowIndex < $swallowOrder.length>>
<<silently>>
<<set _sid to $swallowOrder[$swallowIndex]>>
<<set _name to $swallowNames[_sid]>>
<<set _img to ($swallowPortraits[_sid] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _sid>>
<<set _sess to $swallowIndex + 1>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_sid) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card is-next'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Session " + _sess + " · Available" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<div class="scene-card-grid scene-card-grid-single"><<link _cardHtml _spass>><</link>></div>
<<else>>
<div class="hint" style="margin-bottom:8px;">Story queue complete. Book any of these again.</div>
<div class="scene-card-grid">
<<for _sid range $swallowOrder>>
<<silently>>
<<set _name to $swallowNames[_sid]>>
<<set _img to ($swallowPortraits[_sid] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _sid>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_id) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Repeat" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<<link _cardHtml _spass>><</link>>
<</for>>
</div>
<</if>>
<</if>>
<div class="hint" style="margin-top:8px;">Progress: $swallowIndex / $swallowOrder.length · Total takes: $gloryholeSwallowCount</div>
</div>
<div class="nav-grid">[[Back to Joy Media|Joy Media Studios]]</div>
<</if>><<silently>>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<<unset $mg_Score1>>
<</silently>>
<div class="passage-title">Gloryhole Secrets</div>
<div class="story-img"><img src="career/pics/loc/gloryhole_secrets.jpg" alt="Pro gloryhole set" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<<if not $unlockedGloryholeSecrets>>
Locked. Complete more Gloryhole Swallow sessions first.
[[Back to Joy Media|Joy Media Studios]]
<<elseif $exhaustionLocked>>
Too exhausted to work.
[[Back to Joy Media|Joy Media Studios]]
<<elseif $actionsLeft < 1>>
No actions left today.
[[Back to Joy Media|Joy Media Studios]]
<<elseif $studioSameDayLock>>
Already shot for a studio today. One Joy Media shoot per day.
[[Back to Joy Media|Joy Media Studios]]
<<else>>
<<set $secretsOrder to ["ghx_tommy","ghx_lauren","ghx_cory","ghx_violet","ghx_ella"]>>
<<set $secretsNames to {
"ghx_tommy": "Tommy King",
"ghx_lauren": "Lauren Phillips",
"ghx_cory": "Cory Chase",
"ghx_violet": "Violet Myers",
"ghx_ella": "Ella Knox",
"ghx_nia": "Nia"
}>>
<<if ndef $secretsIndex>><<set $secretsIndex to 0>><</if>>
<<silently>>
<<set $secretsPortraits to {
"ghx_tommy": "career/pics/avatars/tommyking.jpg",
"ghx_lauren": "career/pics/avatars/laurenphillips.jpeg",
"ghx_cory": "career/pics/avatars/corychase.webp",
"ghx_violet": "career/pics/avatars/violetmyers.webp",
"ghx_ella": "career/pics/avatars/ellaknox.jpeg",
"ghx_nia": "career/pics/avatars/nianacci.jpeg"
}>>
<<if not $secretsSameDayLock and $secretsIndex < $secretsOrder.length>>
<<set _sid to $secretsOrder[$secretsIndex]>>
<<set _name to $secretsNames[_sid]>>
<<set _img to ($secretsPortraits[_sid] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _sid>>
<<set _sess to $secretsIndex + 1>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_sid) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card is-next'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Session " + _sess + " · Available" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</if>>
<</silently>>
<div class="panel panel-tight">
<div class="panel-title">Pro queue</div>
<<if $secretsSameDayLock>>
<span class="hint">Already did a Secrets scene today. Sleep for the next slot.</span>
<<elseif $secretsIndex >= $secretsOrder.length>>
<div class="hint" style="margin-bottom:8px;">Pro queue complete. Book any of these again.</div>
<div class="scene-card-grid">
<<for _sid range $secretsOrder>>
<<silently>>
<<set _name to $secretsNames[_sid]>>
<<set _img to ($secretsPortraits[_sid] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _sid>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_sid) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Repeat" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<<link _cardHtml _spass>><</link>>
<</for>>
</div>
<<else>>
<div class="scene-card-grid scene-card-grid-single"><<link _cardHtml _spass>><</link>></div>
<</if>>
<div class="hint" style="margin-top:8px;">Progress: $secretsIndex / <<print $secretsOrder.length>></div>
</div>
<div class="nav-grid">[[Back to Joy Media|Joy Media Studios]]</div>
<</if>><div class="passage-title">Catherine – Gloryhole Swallow</div>
<<if ndef $sceneId or $sceneId !== "ghs_catherine" or ndef $phase>>
<<set $sceneId to "ghs_catherine">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a1.webm" type="video/webm"></video>
</div>
The camera is already rolling when Catherine settles in front of the holes. She tucks a strand of hair behind her ear, a little shy but clearly excited.
<<speech "producer">>Alright Catherine, introduce yourself for the camera.<</speech>>
<<speech "catherine">>Hi… I’m Catherine. First time on one of these. I’ve been thinking about it for weeks and I’m finally here.<</speech>>
<<speech "producer">>Nervous?<</speech>>
<<speech "catherine">>A little. Mostly excited though.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a2.webm" type="video/webm"></video>
</div>
She strips without being told, folds her clothes neatly, and drops to her knees. The first cock slides through. She takes it carefully at first, then finds a rhythm.
<<speech "catherine">>Mmm… okay. This is actually hotter than I expected.<</speech>>
<<speech "producer">>Good. Keep that energy.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a3.webm" type="video/webm"></video>
</div>
The first guy doesn’t last long. She keeps him in her mouth until he finishes, swallows most of it, and wipes the rest from her lip with her thumb.
<<speech "catherine">>Good boy… next.<</speech>>
$playerName’s turn. The producer leans in.
<<speech "producer">>$playerName, don’t just shove it in. Play with her first. Fingers. Get her wet for the camera.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a4.webm" type="video/webm"></video>
</div>
$playerName reaches through and finds her already slick. Two fingers slide in easily. She gasps and pushes back against his hand.
<<speech "catherine">>Oh— fuck… yes, just like that. Don’t stop.<</speech>>
<<speech "you">>Wait… you’re already this wet?<</speech>>
<<speech "catherine">>All morning. It’s worse than I thought.<</speech>>
After a minute the producer nods. $playerName pulls his fingers free and pushes his cock through instead.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a5.webm" type="video/webm"></video>
</div>
Catherine goes quiet for a second when she sees the size.
<<speech "catherine">>Jesus Christ… okay. That’s thicker than the others.<</speech>>
<<speech "producer">>Take your time with it.<</speech>>
She leans in and starts sucking, slower and more careful, one hand wrapped around the base while her tongue works the head.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a6.webm" type="video/webm"></video>
</div>
She forces herself deeper, eyes watering, then pulls off with a wet sound and strokes him firmly with both hands.
<<speech "catherine">>You’re still completely hard… most of the guys before you would have finished already. Fuck, you’re big.<</speech>>
<<speech "you">>Sorry… I didn’t mean to make it hard for you.<</speech>>
<<speech "catherine">>I’m trying… it’s just a lot to fit.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a7.webm" type="video/webm"></video>
</div>
She switches to a focused two-handed stroke, trying to finish him. $playerName holds out. A small frustrated, impressed sound escapes her.
<<speech "catherine">>You’re not even close, are you? Goddamn…<</speech>>
<<speech "producer">>She’s impressed. Keep that control.<</speech>>
She reaches for a condom, rolls it down his length, then turns and backs onto the hole.
<<mgButtons "focus" 2 "career/swallow/BWC/a7.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
She switches to a focused two-handed stroke, trying to finish him. $playerName holds out. A small frustrated, impressed sound escapes her.
<<speech "catherine">>You’re not even close, are you? Goddamn…<</speech>>
<<speech "producer">>She’s impressed. Keep that control.<</speech>>
She reaches for a condom, rolls it down his length, then turns and backs onto the hole.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a8.webm" type="video/webm"></video>
</div>
<<speech "catherine">>Okay… I’m putting you inside. Don’t move yet— let me feel it.<</speech>>
She sinks down slowly until she’s fully seated, then starts riding. Her breathing changes almost immediately.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a9.webm" type="video/webm"></video>
</div>
Her pussy grows louder and creamier with every stroke. She starts moaning properly, hips moving faster.
<<speech "catherine">>Shit… you’re hitting it. Right there. Don’t you dare finish yet— I want to cum on this cock first.<</speech>>
<<speech "you">>Okay… I’ll try. Just— don’t go too fast.<</speech>>
<<speech "catherine">>I’m getting close… just hold on—<</speech>>
<span style="color:#ff6b6b"><<speech "you">>Wait, wait— you’re squeezing too hard, I can’t…<</speech>></span>
<<mgButtons "stamina" 2 "career/swallow/BWC/a9.webm" 2>>
<<elseif $phase == 2>>
Her pussy grows louder and creamier with every stroke. She starts moaning properly, hips moving faster.
<<speech "catherine">>Shit… you’re hitting it. Right there. Don’t you dare finish yet— I want to cum on this cock first.<</speech>>
<<speech "you">>Okay… I’ll try. Just— don’t go too fast.<</speech>>
<<speech "catherine">>I’m getting close… just hold on—<</speech>>
<span style="color:#ff6b6b"><<speech "you">>Wait, wait— you’re squeezing too hard, I can’t…<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a10.webm" type="video/webm"></video>
</div>
$playerName holds out. Catherine’s thighs start to shake. She cums hard around him, a broken moan slipping out as her pussy clenches and floods the condom. The feeling pulls him over right after her — he fills the condom while she’s still pulsing.
<<speech "catherine">>Fuck— I’m cumming… fill it, fill it—! Oh my god…<</speech>>
<<speech "you">>I’m— I’m finishing too…<</speech>>
<<speech "catherine">>I am… fuck, I am—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a11.webm" type="video/webm"></video>
</div>
She carefully peels the condom off and immediately leans in to clean his cock with her mouth, slow and thorough.
<<speech "catherine">>Still hard… and that was a lot. You lasted the way I needed you to.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a12.webm" type="video/webm"></video>
</div>
She lifts the used condom, tips it back, and drinks everything without hesitation.
<<speech "catherine">>Mmm… thick. Tastes good.<</speech>>
<<speech "producer">>Nice. Camera loved that.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a13.webm" type="video/webm"></video>
</div>
She turns back to the remaining holes and starts working the other guys again, methodically making them finish in her mouth one after another.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/a14.webm" type="video/webm"></video>
</div>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
Later, in the exit interview, she looks straight into the camera, still a little flushed.
<<speech "producer">>So… favorite of the day?<</speech>>
<<if $lastScore >= 65>>
<<speech "catherine">>Honestly? The thick one in the middle. Big, hit my G-spot perfectly, and he actually lasted long enough for me to cum on it. His cum tasted really good too. I’d do that again in a heartbeat.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "catherine">>The thick one had the best size… hit the right spot. Wish he’d lasted longer so I could really enjoy it.<</speech>>
<<else>>
<<speech "catherine">>Size was there, but he finished too fast for me to get much out of it. Still hot. Just rushed.<</speech>>
<</if>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_catherine"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Swallow"]]
<<else>>
[[Back to Gloryhole Swallow|Gloryhole Swallow]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Luna Lovesit – Gloryhole Swallow</div>
<<if ndef $sceneId or $sceneId !== "ghs_luna" or ndef $phase>>
<<set $sceneId to "ghs_luna">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b1.webm" type="video/webm"></video>
</div>
Luna is already half-undressed when the camera starts. She turns slowly, showing off her body with easy, playful confidence.
<<speech "producer">>Luna, say hi for the camera.<</speech>>
<<speech "luna">>Hey… I’m Luna. Ready to get messy today.<</speech>>
<<speech "producer">>How are you feeling?<</speech>>
<<speech "luna">>Horny. Let’s get started.<</speech>>
She finishes stripping and steps up to the first hole without hesitation.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b2.webm" type="video/webm"></video>
</div>
The first cock slides through. Luna takes it deep right away, eyes half-lidded, working it with clear experience.
<<speech "luna">>Mmm… first one of the day. Let’s go.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b3.webm" type="video/webm"></video>
</div>
She turns, backs onto another hole, and sinks down until she’s fully seated. She starts riding hard.
<<speech "luna">>Fuck… that’s better. Deeper.<</speech>>
<<speech "producer">>Good. Use him.<</speech>>
$playerName’s turn comes while she’s still being fucked. He steps up and pushes his cock through the hole in front of her face.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b4.webm" type="video/webm"></video>
</div>
Luna looks up, sees the size, and smiles around the cock already in her mouth before switching to his.
<<speech "luna">>Oh hell yes… look at this one. Finally something worth my time.<</speech>>
<<speech "you">>Uh… hi.<</speech>>
<<speech "luna">>I like thick. Don’t be gentle.<</speech>>
She starts sucking him while the other guy keeps fucking her from behind.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b5.webm" type="video/webm"></video>
</div>
She strokes him steadily. A moment later the cock inside her pulses and finishes deep. Luna barely reacts — just keeps working $playerName’s shaft.
<<speech "luna">>There it is… fill me up. I’m busy.<</speech>>
<<mgButtons "technique" 2 "career/swallow/BWC/b5.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
She strokes him steadily. A moment later the cock inside her pulses and finishes deep. Luna barely reacts — just keeps working $playerName’s shaft.
<<speech "luna">>There it is… fill me up. I’m busy.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b6.webm" type="video/webm"></video>
</div>
She pulls off the hole, reaches back, and spreads herself for the camera, showing off the fresh creampie while she licks and kisses the head of $playerName’s cock.
<<speech "luna">>Look at that… still dripping. Your turn to use my mouth properly.<</speech>>
<<speech "producer">>Show the camera. Nice.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b7.webm" type="video/webm"></video>
</div>
She finally gives him her full attention, taking him deep, throat relaxing around the thickness.
<<speech "luna">>God, you’re thick… stay right there. Don’t move.<</speech>>
<<speech "you">>Okay… I’ll try not to move.<</speech>>
<<speech "luna">>Mmmph— trying…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b8.webm" type="video/webm"></video>
</div>
She drops lower and starts licking his balls while someone fingers her from behind. She stays focused on him the whole time.
<<speech "luna">>You smell so fucking good…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b9.webm" type="video/webm"></video>
</div>
Another cock appears through a side hole. Luna takes it into her mouth without missing a beat, still stroking $playerName with her free hand.
<<speech "luna">>Don’t finish yet… I want that load down my throat.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close already… I don’t know if I can hold it.<</speech>></span>
<<speech "luna">>I will. Just hold on for me.<</speech>>
<<mgButtons "focus" 2 "career/swallow/BWC/b9.webm" 2>>
<<elseif $phase == 2>>
Another cock appears through a side hole. Luna takes it into her mouth without missing a beat, still stroking $playerName with her free hand.
<<speech "luna">>Don’t finish yet… I want that load down my throat.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close already… I don’t know if I can hold it.<</speech>></span>
<<speech "luna">>I will. Just hold on for me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b10.webm" type="video/webm"></video>
</div>
$playerName holds control. Luna switches fully onto him, taking him deep as he starts to pulse. She keeps stroking the other cock with her hand while he empties straight down her throat.
<<speech "luna">>Mmmph— yes, give it to me… all of it.<</speech>>
<<speech "you">>I’m— I’m finishing…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b10a.webm" type="video/webm"></video>
</div>
She pulls back just enough to show the camera the thick load on her tongue, then swallows it in one clean motion and immediately goes back to sucking the other cock.
<<speech "luna">>Mmm… perfect.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b11.webm" type="video/webm"></video>
</div>
The rest of the session continues. Multiple cocks use her. At one point she turns and spreads herself again, showing the camera another fresh creampie with a satisfied look.
<<speech "producer">>Show that off. Perfect.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/b12.webm" type="video/webm"></video>
</div>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
Later, in the exit interview, Luna is still smiling, a little flushed, hair messy.
<<speech "producer">>Favorite of the day?<</speech>>
<<if $lastScore >= 65>>
<<speech "luna">>That thick one? Perfect. Held out until I had him deep and then gave me everything. I swallowed every drop. Definitely one of the better ones today.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "luna">>The thick one was good… solid size. Could’ve lasted a bit longer, but I still enjoyed it.<</speech>>
<<else>>
<<speech "luna">>Size was nice on the thick one, but he didn’t last. Still fun. Just short.<</speech>>
<</if>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_luna"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Swallow"]]
<<else>>
[[Back to Gloryhole Swallow|Gloryhole Swallow]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Courtney Loxx & Kristina – Gloryhole Swallow</div>
<<if ndef $sceneId or $sceneId !== "ghs_courtney" or ndef $phase>>
<<set $sceneId to "ghs_courtney">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c1.webm" type="video/webm"></video>
</div>
Two young actresses stand outside the booth, already giggling and feeding off each other’s energy.
<<speech "producer">>Alright girls, introduce yourselves.<</speech>>
<<speech "courtney">>I’m Courtney. We’re so ready for this.<</speech>>
<<speech "kristina">>Kristina. I’m actually nervous… in a good way. Like the fun kind.<</speech>>
<<speech "producer">>First time doing a gloryhole together?<</speech>>
<<speech "courtney">>Yeah. We’ve talked about it for ages.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c2.webm" type="video/webm"></video>
</div>
Inside, the first cock appears. Both girls immediately grab it, stroking together, laughing and talking over each other.
<<speech "courtney">>Look how hard he already is.<</speech>>
<<speech "kristina">>I know, right? This is crazy.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c3.webm" type="video/webm"></video>
</div>
They start helping each other. One holds the other’s hair back while she takes the cock into her mouth, then they switch.
<<speech "courtney">>Deeper… you can take more.<</speech>>
<<speech "kristina">>I’m trying— fuck, he’s throbbing.<</speech>>
$playerName’s cock finally slides through the hole.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c4.webm" type="video/webm"></video>
</div>
Both girls go quiet for a second.
<<speech "courtney">>Oh my god… look at the size of that.<</speech>>
<<speech "kristina">>That’s not normal. That’s actually huge.<</speech>>
<<speech "producer">>React to it. Camera’s on you.<</speech>>
One of them starts stroking him slowly while they both lean in to study it.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c5.webm" type="video/webm"></video>
</div>
Courtney leans in first. She struggles to get the head into her mouth while Kristina holds her hair out of the way.
<<speech "courtney">>Fuck… the head alone is thick. I’m not even sure I can take it properly.<</speech>>
<<speech "kristina">>Go slow. You’ve got this.<</speech>>
<<speech "you">>Sorry if it’s too much…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c6.webm" type="video/webm"></video>
</div>
Kristina tries to roll a condom on him. It takes both of them a moment because of the size, but they eventually get it on, laughing the whole time.
<<speech "kristina">>Okay… I think it’s finally on. That was a fight.<</speech>>
<<speech "courtney">>Worth it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c7.webm" type="video/webm"></video>
</div>
Courtney turns and backs onto the hole. She takes her time lining him up, then starts pushing back.
<<speech "courtney">>Okay… going in. Holy shit— it’s stretching me already.<</speech>>
<<speech "kristina">>You okay?<</speech>>
<<speech "courtney">>Yeah… just big. Really big.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c8.webm" type="video/webm"></video>
</div>
$playerName starts fucking her through the hole. Courtney is bent forward, moaning loudly every time he pushes deep.
<<speech "courtney">>Fuck, fuck, fuck… it’s so deep— don’t stop. Keep going just like that.<</speech>>
<<speech "you">>I’ll try… it feels really tight.<</speech>>
<<speech "courtney">>Don’t you dare pull out—<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close already… I don’t know how long I can keep this up.<</speech>></span>
<<mgButtons "technique" 2 "career/swallow/BWC/c8.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
$playerName starts fucking her through the hole. Courtney is bent forward, moaning loudly every time he pushes deep.
<<speech "courtney">>Fuck, fuck, fuck… it’s so deep— don’t stop. Keep going just like that.<</speech>>
<<speech "you">>I’ll try… it feels really tight.<</speech>>
<<speech "courtney">>Don’t you dare pull out—<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close already… I don’t know how long I can keep this up.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c9.webm" type="video/webm"></video>
</div>
Kristina pulls the condom off and immediately takes him into her mouth, trying to deepthroat while Courtney holds her hair.
<<speech "kristina">>Mmm… still so hard. How are you still this hard after that?<</speech>>
<<speech "courtney">>Because he’s built different.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c10.webm" type="video/webm"></video>
</div>
Courtney wants another turn. They switch places and she starts sucking him again, more confident this time.
<<speech "courtney">>My turn again. I want to feel it properly this time.<</speech>>
<<speech "you">>Okay… go ahead.<</speech>>
<<speech "courtney">>Gladly.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c11.webm" type="video/webm"></video>
</div>
They decide to finish him together. Both girls wrap their hands around his cock and start stroking in rhythm.
<<speech "kristina">>He’s getting close… I can feel it.<</speech>>
<<speech "courtney">>Keep going, don’t stop. We want all of it.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m really close… I can’t hold it much longer.<</speech>></span>
<<mgButtons "stamina" 2 "career/swallow/BWC/c11.webm" 2>>
<<elseif $phase == 2>>
They decide to finish him together. Both girls wrap their hands around his cock and start stroking in rhythm.
<<speech "kristina">>He’s getting close… I can feel it.<</speech>>
<<speech "courtney">>Keep going, don’t stop. We want all of it.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m really close… I can’t hold it much longer.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c12.webm" type="video/webm"></video>
</div>
$playerName tells them he’s close. They immediately pick up the pace, both hands working him harder.
<<speech "you">>I’m finishing… don’t stop.<</speech>>
<<speech "courtney">>We’ve got you. Just let go.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c13.webm" type="video/webm"></video>
</div>
He finishes hard. They keep stroking through it, squeezing every drop out and spreading the thick load all over his cock and their hands.
<<speech "courtney">>Oh my god look how much—<</speech>>
<<speech "kristina">>It’s still coming out… fuck.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c14.webm" type="video/webm"></video>
</div>
Both girls hold their cum-covered hands up to the camera, smiling wide.
<<speech "courtney">>That was insane.<</speech>>
<<speech "kristina">>I’ve never seen one that big actually last that long.<</speech>>
<<speech "producer">>Hold them up. Perfect.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/c15.webm" type="video/webm"></video>
</div>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
In the exit interview they are still buzzing.
<<speech "producer">>So… thoughts on the big one?<</speech>>
<<if $lastScore >= 65>>
<<speech "courtney">>Perfect. Size, stamina, everything. We both wanted to keep going.<</speech>>
<<speech "kristina">>Seriously. Best cock of the day by far.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "courtney">>Good size. We had fun. A little more stamina and it would’ve been perfect.<</speech>>
<<speech "kristina">>Yeah. Solid. Not our longest, but not bad.<</speech>>
<<else>>
<<speech "courtney">>He was thick, but he didn’t last long enough for both of us.<</speech>>
<<speech "kristina">>Still hot. Just… quick.<</speech>>
<</if>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_courtney"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Swallow"]]
<<else>>
[[Back to Gloryhole Swallow|Gloryhole Swallow]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Nikki Nicole – Gloryhole Swallow</div>
<<if ndef $sceneId or $sceneId !== "ghs_nikki" or ndef $phase>>
<<set $sceneId to "ghs_nikki">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d1.webm" type="video/webm"></video>
</div>
Nikki stands in front of the camera, already comfortable in her own skin. She turns slowly, showing off her body with a relaxed, almost proud smile.
<<speech "producer">>Nikki, introduce yourself.<</speech>>
<<speech "nikki">>Hey… I’m Nikki. I’m naked at home almost always, so this feels pretty natural.<</speech>>
<<speech "producer">>First time on Gloryhole Swallow?<</speech>>
<<speech "nikki">>Yeah. I’ve been curious for a while. Figured I’d just do it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d2.webm" type="video/webm"></video>
</div>
She slips her panties off, drops them to the side, and settles onto her knees in front of the holes, clearly ready.
<<speech "nikki">>Okay… let’s see what you’ve got for me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d3.webm" type="video/webm"></video>
</div>
The first cock slides through. Nikki takes it without hesitation, working it with steady focus, eyes half-lidded.
<<speech "nikki">>Mmm… nice. Warm.<</speech>>
<<speech "producer">>Good pace. Keep it natural.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d4.webm" type="video/webm"></video>
</div>
Later she turns and backs onto a hole. After a few minutes the cock inside her finishes. She pulls off slowly and reaches back, spreading herself so the camera can see the cum leaking out of her pussy.
<<speech "nikki">>Look… still coming out.<</speech>>
<<speech "producer">>Hold that. Perfect.<</speech>>
<<speech "nikki">>Feels good. Messy in the best way.<</speech>>
$playerName is the last cock of the scene. He steps up and pushes through the hole in front of her.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d5.webm" type="video/webm"></video>
</div>
Nikki looks at it, then starts stroking and licking, getting him fully hard with clear intent.
<<speech "nikki">>Oh… this one’s thicker. Last one of the day, huh?<</speech>>
<<speech "you">>Yeah… I guess so.<</speech>>
<<speech "nikki">>I plan to make it count.<</speech>>
<<mgButtons "technique" 2 "career/swallow/BWC/d5.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
Nikki looks at it, then starts stroking and licking, getting him fully hard with clear intent.
<<speech "nikki">>Oh… this one’s thicker. Last one of the day, huh?<</speech>>
<<speech "you">>Yeah… I guess so.<</speech>>
<<speech "nikki">>I plan to make it count.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d6.webm" type="video/webm"></video>
</div>
She takes him deeper, throat working, one hand stroking what she can’t fit. Spit starts to run down her chin.
<<speech "nikki">>Fuck… you’re filling my throat already.<</speech>>
<<speech "you">>You’re… really good at that.<</speech>>
<<speech "nikki">>I know. Give it to me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d7.webm" type="video/webm"></video>
</div>
She pulls off, spits on his cock, and immediately sinks back down, trying to force him over the edge. Her eyes are locked on him.
<<speech "nikki">>Come on… I want it. Don’t hold back on me.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close… I don’t know if I can last much longer.<</speech>></span>
<<speech "nikki">>Then make me work for it.<</speech>>
<<mgButtons "focus" 2 "career/swallow/BWC/d7.webm" 2>>
<<elseif $phase == 2>>
She pulls off, spits on his cock, and immediately sinks back down, trying to force him over the edge. Her eyes are locked on him.
<<speech "nikki">>Come on… I want it. Don’t hold back on me.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close… I don’t know if I can last much longer.<</speech>></span>
<<speech "nikki">>Then make me work for it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d8.webm" type="video/webm"></video>
</div>
$playerName still holds out. Nikki switches to both hands, stroking hard while she sticks her tongue out and looks up at him, openly begging.
<<speech "nikki">>Please… I’ve been good. Give it to me. I want to taste it.<</speech>>
<<speech "you">>Okay… I’m close.<</speech>>
<<speech "nikki">>Fuck— yes, yes, yes—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d9.webm" type="video/webm"></video>
</div>
He finally starts to cum. Nikki immediately drops her mouth onto him, catching every pulse on her tongue and swallowing without wasting a drop.
<<speech "nikki">>Mmmph— all of it… good boy.<</speech>>
<<speech "you">>I’m— I’m finishing…<</speech>>
<<speech "nikki">>Already did.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/d10.webm" type="video/webm"></video>
</div>
The scene winds down. Nikki is flushed, a little sweaty, hair messy, still smiling as she shows her body and face to the camera one last time.
<<speech "producer">>How do you feel?<</speech>>
<<speech "nikki">>Really good. That last one held out just long enough and then gave me everything. I swallowed every drop. Perfect way to end it.<</speech>>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_nikki"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Swallow"]]
<<else>>
[[Back to Gloryhole Swallow|Gloryhole Swallow]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Eskimo Emma & Friend – Gloryhole Swallow</div>
<<if ndef $sceneId or $sceneId !== "ghs_emma" or ndef $phase>>
<<set $sceneId to "ghs_emma">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/e1.webm" type="video/webm"></video>
</div>
Two girls are already in the booth when the camera starts. They’re kissing slowly, bodies pressed together, hands roaming as part of the opening interview.
<<speech "producer">>Keep going. Camera loves this.<</speech>>
<<speech "emma">>We’ve been looking forward to this all day.<</speech>>
<<speech "friend">>Especially together.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/e2.webm" type="video/webm"></video>
</div>
The kiss turns deeper and more passionate. They smile against each other’s mouths, clearly enjoying the show they’re putting on.
<<speech "emma">>You’re such a good kisser…<</speech>>
<<speech "friend">>You’re one to talk.<</speech>>
<<speech "producer">>Alright… first cock is ready.<</speech>>
$playerName has been watching from the other side. He’s already hard when he pushes through the hole.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/e3.webm" type="video/webm"></video>
</div>
Both girls break the kiss and immediately lean in, tongues out, licking along the length of his cock together.
<<speech "emma">>Oh fuck… look at this.<</speech>>
<<speech "friend">>He’s already leaking.<</speech>>
<<speech "you">>Uh… hi.<</speech>>
<<speech "emma">>And we’re going to finish it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/e4.webm" type="video/webm"></video>
</div>
They keep working him with their tongues, both of them sucking on the head at the same time, spit mixing as they share the tip.
<<speech "friend">>He tastes so good…<</speech>>
<<speech "emma">>Don’t hog it.<</speech>>
<<speech "you">>There’s… enough for both of you, I guess.<</speech>>
<<mgButtons "focus" 2 "career/swallow/BWC/e4.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
They keep working him with their tongues, both of them sucking on the head at the same time, spit mixing as they share the tip.
<<speech "friend">>He tastes so good…<</speech>>
<<speech "emma">>Don’t hog it.<</speech>>
<<speech "you">>There’s… enough for both of you, I guess.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/e5.webm" type="video/webm"></video>
</div>
They switch to using their lips, wrapping them around the shaft and stroking him with slow, wet pressure while looking up at each other and smiling.
<<speech "emma">>Feel how hard he is?<</speech>>
<<speech "friend">>He’s throbbing…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/e6.webm" type="video/webm"></video>
</div>
Both girls lock onto the head at the same time, lips sealed on opposite sides, and start increasing the pace. The wet sounds get louder.
<<speech "emma">>Come on… give it to us.<</speech>>
<<speech "friend">>We want it.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close… both of you at once is a lot.<</speech>></span>
<<mgButtons "technique" 2 "career/swallow/BWC/e6.webm" 2>>
<<elseif $phase == 2>>
Both girls lock onto the head at the same time, lips sealed on opposite sides, and start increasing the pace. The wet sounds get louder.
<<speech "emma">>Come on… give it to us.<</speech>>
<<speech "friend">>We want it.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close… both of you at once is a lot.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/e7.webm" type="video/webm"></video>
</div>
$playerName holds out as long as he can, then finally lets go. He finishes deep in Emma’s mouth while her friend watches closely, eyes bright.
<<speech "emma">>Mmmph— fuck, it’s a lot—<</speech>>
<<speech "friend">>Don’t swallow it all… share.<</speech>>
<<speech "you">>I’m— I’m finishing…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/e8.webm" type="video/webm"></video>
</div>
Emma turns to the camera, opens her mouth, and shows the thick load sitting on her tongue. Then she leans in and kisses her friend deeply, pushing the cum into her mouth. They swap it back and forth in a messy, eager tongue battle, both of them smiling through it.
<<speech "emma">>Taste that?<</speech>>
<<speech "friend">>Fuck… yes.<</speech>>
<<speech "producer">>Keep sharing. Perfect shot.<</speech>>
<<speech "you">>You two are… really into this.<</speech>>
<<speech "emma">>You love it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/e9.webm" type="video/webm"></video>
</div>
Eventually the friend leaves the booth. Emma stays and turns her attention to the remaining holes, using her pussy on several more cocks until the session finally ends.
<<speech "emma">>Still not done… come on then.<</speech>>
<<speech "producer">>That’s a wrap when you’re ready.<</speech>>
Later, during the short exit moment, Emma looks satisfied and a little messy.
<<speech "emma">>That first thick one was perfect. Held out while we both worked him and then gave me everything. Sharing it with her made it even better.<</speech>>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_emma"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Swallow"]]
<<else>>
[[Back to Gloryhole Swallow|Gloryhole Swallow]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Chantell & Annabeth – Gloryhole Swallow</div>
<<if ndef $sceneId or $sceneId !== "ghs_chantell" or ndef $phase>>
<<set $sceneId to "ghs_chantell">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f1.webm" type="video/webm"></video>
</div>
Two women are already in the booth. Annabeth is pressed against one of the holes while hands from the other side grope her freely. Chantell watches with a hungry smile.
<<speech "producer">>Keep it natural. Camera’s rolling.<</speech>>
<<speech "annabeth">>They’re already all over me…<</speech>>
<<speech "chantell">>Good. Let them.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f2.webm" type="video/webm"></video>
</div>
A cock pushes into Annabeth. She starts getting fucked hard while leaning over to suck and lick Chantell’s tits.
<<speech "annabeth">>Fuck— it’s deep…<</speech>>
<<speech "chantell">>That’s it. Take it while you suck on me.<</speech>>
<<speech "producer">>Nice contrast. Keep going.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f3.webm" type="video/webm"></video>
</div>
The cock inside Annabeth finishes. She pulls off and Chantell immediately drops down, licking the cum as it leaks out of her pussy right in front of the camera.
<<speech "chantell">>Mmm… look at that. Still dripping.<</speech>>
<<speech "annabeth">>Clean it up for me.<</speech>>
<<speech "producer">>Hold the shot. Perfect.<</speech>>
$playerName’s cock enters next. Annabeth is already sucking on a black cock when he pushes through. Chantell leans in and starts licking the head of $playerName’s cock.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f4.webm" type="video/webm"></video>
</div>
<<speech "chantell">>Oh… this one’s thick.<</speech>>
<<speech "annabeth">>Don’t keep him to yourself.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f5.webm" type="video/webm"></video>
</div>
Chantell turns and starts lowering herself onto $playerName’s cock while Annabeth prepares to take another cock at the same time.
<<speech "chantell">>Fuck… he’s stretching me already.<</speech>>
<<speech "annabeth">>I want one too. Hurry up.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f6.webm" type="video/webm"></video>
</div>
Both girls are being fucked now — Annabeth by a black cock, Chantell by $playerName. They start competing, trying to see who can make their cock finish first, moaning and talking shit the whole time.
<<speech "annabeth">>I’m gonna make mine cum first.<</speech>>
<<speech "chantell">>Not a chance. He’s already throbbing inside me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f7.webm" type="video/webm"></video>
</div>
They both take the cocks deeper, moaning in rough synchronization, hips moving together.
<<speech "chantell">>Deep… just like that.<</speech>>
<<speech "annabeth">>Fuck, I can feel every inch—<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re so tight… I don’t know how long I can last.<</speech>></span>
<<mgButtons "focus" 2 "career/swallow/BWC/f7.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
They both take the cocks deeper, moaning in rough synchronization, hips moving together.
<<speech "chantell">>Deep… just like that.<</speech>>
<<speech "annabeth">>Fuck, I can feel every inch—<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re so tight… I don’t know how long I can last.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f8.webm" type="video/webm"></video>
</div>
The black cock inside Annabeth finishes first. She cries out as she feels it. $playerName is still going strong inside Chantell.
<<speech "annabeth">>Fuck— he’s cumming inside me—!<</speech>>
<<speech "chantell">>Don’t you dare finish yet. I want yours too.<</speech>>
<<mgButtons "stamina" 2 "career/swallow/BWC/f8.webm" 2>>
<<elseif $phase == 2>>
The black cock inside Annabeth finishes first. She cries out as she feels it. $playerName is still going strong inside Chantell.
<<speech "annabeth">>Fuck— he’s cumming inside me—!<</speech>>
<<speech "chantell">>Don’t you dare finish yet. I want yours too.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f9.webm" type="video/webm"></video>
</div>
$playerName holds out longer, then finally empties deep inside Chantell’s pussy while she grinds back against him.
<<speech "chantell">>Yes— fill me up. Fuck, that’s a lot—<</speech>>
<<speech "you">>I’m finishing…<</speech>>
<<speech "annabeth">>Let me see…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f10.webm" type="video/webm"></video>
</div>
Both girls turn toward the camera and spread themselves, showing their cum-filled pussies. Thick loads drip out as they hold the pose.
<<speech "chantell">>Look at that… both of us full.<</speech>>
<<speech "annabeth">>Messy as hell.<</speech>>
<<speech "producer">>Hold it. Beautiful.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/f11.webm" type="video/webm"></video>
</div>
They lean in and kiss each other passionately, tasting the session on each other’s tongues while the camera stays tight on them.
<<speech "chantell">>You taste like cum and me.<</speech>>
<<speech "annabeth">>So do you…<</speech>>
<<speech "producer">>That’s a wrap. Great work.<</speech>>
<<speech "chantell">>That white cock held out perfectly. Filled me up right after the other one finished. Best load of the day.<</speech>>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_chantell"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Swallow"]]
<<else>>
[[Back to Gloryhole Swallow|Gloryhole Swallow]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Yaya & Faith – Gloryhole Swallow</div>
<<if ndef $sceneId or $sceneId !== "ghs_yaya" or ndef $phase>>
<<set $sceneId to "ghs_yaya">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g1.webm" type="video/webm"></video>
</div>
Two redheads are already in the booth when the camera starts. Yaya is sucking and kissing Faith’s breasts, both of them smiling into it.
<<speech "producer">>Nice and slow. Let the camera enjoy it.<</speech>>
<<speech "yaya">>You taste so good already…<</speech>>
<<speech "faith">>Don’t stop.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g2.webm" type="video/webm"></video>
</div>
Yaya drops lower and starts licking Faith’s pussy right there in the booth. Faith leans back against the wall, hand in Yaya’s hair.
<<speech "faith">>Fuck… just like that.<</speech>>
<<speech "yaya">>You’re already wet for me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g3.webm" type="video/webm"></video>
</div>
They pull each other’s clothes off between kisses, bodies pressed together, clearly more interested in each other than the holes for the moment.
<<speech "yaya">>I could do this all day.<</speech>>
<<speech "faith">>We still have cocks waiting.<</speech>>
<<speech "producer">>First ones are ready whenever you are.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g4.webm" type="video/webm"></video>
</div>
They finally turn to the holes and take turns making the first cock finish in their mouths, one after the other, swallowing cleanly.
<<speech "yaya">>Mmm… warm.<</speech>>
<<speech "faith">>My turn. Don’t hog it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g5.webm" type="video/webm"></video>
</div>
After both have tasted the load, they kiss again, slowly, sharing the taste and playing with each other’s tongues.
<<speech "yaya">>You still taste like him.<</speech>>
<<speech "faith">>So do you…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g6.webm" type="video/webm"></video>
</div>
They move to each other’s necks, kissing and biting lightly, putting on a clear display for the camera.
<<speech "producer">>Beautiful. Keep that energy.<</speech>>
$playerName’s cock finally enters — only half erect at first. Both girls immediately start stroking and examining it.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g7.webm" type="video/webm"></video>
</div>
<<speech "yaya">>He’s not even fully hard yet… look at the size though.<</speech>>
<<speech "faith">>We’ll fix that.<</speech>>
<<speech "you">>Uh… okay.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g8.webm" type="video/webm"></video>
</div>
They start licking together. Yaya drops lower to his balls while Faith sucks on the head.
<<speech "yaya">>Fuck, his balls are heavy…<</speech>>
<<speech "faith">>The head’s already swelling.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g9.webm" type="video/webm"></video>
</div>
Faith holds Yaya’s hair as she starts taking him deeper, working him into her throat while the other girl stays on his balls.
<<speech "faith">>That’s it… take him deeper.<</speech>>
<<speech "yaya">>Mmmph— trying…<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re both… really intense.<</speech>></span>
<<mgButtons "focus" 2 "career/swallow/BWC/g9.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
Faith holds Yaya’s hair as she starts taking him deeper, working him into her throat while the other girl stays on his balls.
<<speech "faith">>That’s it… take him deeper.<</speech>>
<<speech "yaya">>Mmmph— trying…<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re both… really intense.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g10.webm" type="video/webm"></video>
</div>
They switch. Yaya takes him into her mouth while Faith licks and sucks on his balls.
<<speech "yaya">>Still so hard… how are you still this hard?<</speech>>
<<speech "faith">>Because we haven’t finished him yet.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g11.webm" type="video/webm"></video>
</div>
They kiss each other again while still holding him. He’s clearly not close yet.
<<speech "yaya">>He’s not even close. We need to use more than our mouths.<</speech>>
<<speech "faith">>Pussy it is then.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g12.webm" type="video/webm"></video>
</div>
Yaya goes first. She lines him up and sinks down, taking him into her pussy while Faith leans in to lick and suck on her breasts.
<<speech "yaya">>Fuck— he’s thick inside me…<</speech>>
<<speech "faith">>Ride him. I want to watch.<</speech>>
<<speech "you">>It feels… really good.<</speech>>
<<mgButtons "stamina" 2 "career/swallow/BWC/g12.webm" 2>>
<<elseif $phase == 2>>
Yaya goes first. She lines him up and sinks down, taking him into her pussy while Faith leans in to lick and suck on her breasts.
<<speech "yaya">>Fuck— he’s thick inside me…<</speech>>
<<speech "faith">>Ride him. I want to watch.<</speech>>
<<speech "you">>It feels… really good.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g13.webm" type="video/webm"></video>
</div>
They switch. Faith takes him next, fucking herself on his cock with clear urgency, moaning louder with every drop of her hips.
<<speech "faith">>Shit— it’s so deep… I’m not going to last—<</speech>>
<<speech "yaya">>Make her cum on it.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close… I don’t know if I can hold it.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g14.webm" type="video/webm"></video>
</div>
Faith orgasms hard, legs shaking. The feeling pulls $playerName over the edge and he finishes deep inside her while she’s still pulsing.
<<speech "faith">>Fuck— I’m cumming… fill me—!<</speech>>
<<speech "you">>I’m finishing too…<</speech>>
<<speech "yaya">>That’s it… give it to her.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g15.webm" type="video/webm"></video>
</div>
Yaya immediately drops down and starts cleaning Faith’s pussy with her tongue, spreading her open with both hands while Faith stands above her.
<<speech "yaya">>Mmm… you taste like him now.<</speech>>
<<speech "faith">>Don’t waste any of it.<</speech>>
<<speech "producer">>Perfect shot. Keep cleaning her.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/g16.webm" type="video/webm"></video>
</div>
They kiss again, tasting $playerName’s cum on each other’s tongues, getting even more worked up as the scene ends.
<<speech "yaya">>We’re both filthy now.<</speech>>
<<speech "faith">>And I still want more…<</speech>>
<<speech "yaya">>That thick one lasted perfectly. Let us both ride him and still had enough to fill her up. Best load of the day.<</speech>>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_yaya"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Swallow"]]
<<else>>
[[Back to Gloryhole Swallow|Gloryhole Swallow]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Indica Monroe & Italy – Gloryhole Swallow</div>
<<if ndef $sceneId or $sceneId !== "ghs_indica" or ndef $phase>>
<<set $sceneId to "ghs_indica">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h1.webm" type="video/webm"></video>
</div>
Indica and Italy are already putting on a show in the studio, kissing deeply in front of the waiting male talent. Hands roam, bodies pressed together, clearly aware of the eyes on them.
<<speech "producer">>That’s it. Give them a reason to stay hard.<</speech>>
<<speech "indica">>You feel that? They’re all watching us.<</speech>>
<<speech "italy">>Let them. I like the attention.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h2.webm" type="video/webm"></video>
</div>
Indica drops to Italy’s chest, sucking and kissing her breasts while they keep making out, louder and messier now.
<<speech "italy">>Fuck… don’t stop.<</speech>>
<<speech "indica">>You taste so good when you’re turned on.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h3.webm" type="video/webm"></video>
</div>
They finally step into the booth. Both drop to their knees. Italy takes $playerName’s cock while Indica takes the one next to him.
<<speech "italy">>This one’s already thick… look at it.<</speech>>
<<speech "indica">>Mine’s eager too. Let’s see who finishes first.<</speech>>
<<speech "you">>Uh… okay.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h4.webm" type="video/webm"></video>
</div>
Italy works $playerName diligently — hand and mouth moving in rhythm — while Indica is already deepthroating her cock with practiced ease.
<<speech "italy">>Mmm… you’re filling my hand and my mouth at the same time.<</speech>>
<<speech "indica">>Deeper… just like that.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h5.webm" type="video/webm"></video>
</div>
Indica’s cock pulses and finishes in her mouth. She swallows, then turns to watch Italy still working $playerName.
<<speech "indica">>He’s still going strong. Look at her struggle with it.<</speech>>
<<speech "italy">>I’m not struggling… I’m enjoying it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h6.webm" type="video/webm"></video>
</div>
Indica stays close, watching Italy deepthroat $playerName with clear effort, trying to force him over the edge.
<<speech "indica">>Push him. I want to see him break.<</speech>>
<<speech "italy">>He’s so fucking thick in my throat…<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re… really deep. I don’t know how long I can last.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h7.webm" type="video/webm"></video>
</div>
They break for a messy kiss right in front of his cock, then Indica puts both hands on Italy’s head and starts pushing her deeper onto him.
<<speech "indica">>Take him deeper. I know you can.<</speech>>
<<speech "italy">>Mmmph— fuck—<</speech>>
<<mgButtons "focus" 2 "career/swallow/BWC/h7.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
They break for a messy kiss right in front of his cock, then Indica puts both hands on Italy’s head and starts pushing her deeper onto him.
<<speech "indica">>Take him deeper. I know you can.<</speech>>
<<speech "italy">>Mmmph— fuck—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h8.webm" type="video/webm"></video>
</div>
Indica drops lower and starts licking and sucking $playerName’s balls while Italy keeps her mouth locked around his cock, working him harder.
<<speech "indica">>His balls are so full… he’s close.<</speech>>
<<speech "italy">>I can feel him throbbing… come on, give it to me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h9.webm" type="video/webm"></video>
</div>
Italy doubles down, sucking with everything she has while Indica stays on his balls. The pressure builds fast.
<<speech "italy">>I want it… all of it in my mouth.<</speech>>
<<speech "indica">>Give it to her. She’s earned it.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m finishing… I can’t hold it.<</speech>></span>
<<mgButtons "stamina" 2 "career/swallow/BWC/h9.webm" 2>>
<<elseif $phase == 2>>
Italy doubles down, sucking with everything she has while Indica stays on his balls. The pressure builds fast.
<<speech "italy">>I want it… all of it in my mouth.<</speech>>
<<speech "indica">>Give it to her. She’s earned it.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m finishing… I can’t hold it.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h9.webm" type="video/webm"></video>
</div>
$playerName finally lets go. He cums hard into Italy’s mouth while Indica turns to another cock and starts sucking it, still watching from the side.
<<speech "italy">>Mmmph— yes… fill me—<</speech>>
<<speech "indica">>That’s it… take it all.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h10.webm" type="video/webm"></video>
</div>
Italy turns to the camera, opens her mouth, and shows the thick load sitting on her tongue. Then she swallows it cleanly with a satisfied smile and crawls over to watch her friend work another cock.
<<speech "italy">>Mmm… perfect.<</speech>>
<<speech "producer">>Show it off. Nice.<</speech>>
<<speech "indica">>Come here and help me with this one.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/h11.webm" type="video/webm"></video>
</div>
While Indica strokes another cock, both girls talk about $playerName, still clearly impressed.
<<speech "italy">>That thick one was the best of the day. Held out while we both worked him and then gave me everything. I measured him with my hand… he’s bigger than he looks.<</speech>>
<<speech "indica">>She wasn’t exaggerating. I felt how hard he stayed the whole time.<</speech>>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_indica"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Swallow"]]
<<else>>
[[Back to Gloryhole Swallow|Gloryhole Swallow]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Rebel Rhyder & Lulu – Gloryhole Swallow</div>
<<if ndef $sceneId or $sceneId !== "ghs_rebel" or ndef $phase>>
<<set $sceneId to "ghs_rebel">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i1.webm" type="video/webm"></video>
</div>
Rebel Rhyder is already in the studio, completely in control. She reaches over and slowly pulls Lulu’s panties down in front of everyone, making the amateur blush while the crew watches.
<<speech "rebel">>Relax. They’re all going to see a lot more than this today.<</speech>>
<<speech "lulu">>I’ve never done anything like this…<</speech>>
<<speech "rebel">>That’s why I’m here. Just follow my lead.<</speech>>
<<speech "producer">>Rebecca wanted the contrast. Famous and fresh. Make it count.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i2.webm" type="video/webm"></video>
</div>
Rebel drops to her knees right there in the open studio and starts licking Lulu’s pussy without hesitation. Lulu’s hands find Rebel’s hair as she tries to stay standing.
<<speech "lulu">>Fuck… you’re really doing this in front of everyone—<</speech>>
<<speech "rebel">>Get used to it. The camera loves shy girls getting ruined.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i3.webm" type="video/webm"></video>
</div>
They step into the booth. Lulu is already on a cock, nervous but trying. Rebel stays close, guiding her, stroking her hair and talking her through it.
<<speech "rebel">>Deeper. Don’t be scared of it. He likes it when you struggle a little.<</speech>>
<<speech "lulu">>It’s so big…<</speech>>
<<speech "rebel">>You’ll get bigger ones today. Trust me.<</speech>>
$playerName’s turn. His cock slides through.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i4.webm" type="video/webm"></video>
</div>
Lulu goes first — soft lips, hesitant hand, kissing along the shaft before she starts stroking and sucking.
<<speech "lulu">>He’s already so hard… and thick.<</speech>>
<<speech "rebel">>That’s the one I was told about. Don’t be gentle with him.<</speech>>
<<speech "you">>I… okay.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i5.webm" type="video/webm"></video>
</div>
Rebel takes over the head while Lulu drops to his balls, both of them working him together.
<<speech "rebel">>Fuck… you’re even thicker than they said.<</speech>>
<<speech "lulu">>His balls are so full…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i6.webm" type="video/webm"></video>
</div>
Rebel fully takes control — one hand stroking, mouth locked around him, eyes looking up with clear intent. She’s trying to make him finish.
<<speech "rebel">>Come on… give me that load. I want to show the camera how much you have.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re really good at that… I’m getting close already.<</speech>></span>
<<mgButtons "focus" 2 "career/swallow/BWC/i6.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
Rebel fully takes control — one hand stroking, mouth locked around him, eyes looking up with clear intent. She’s trying to make him finish.
<<speech "rebel">>Come on… give me that load. I want to show the camera how much you have.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re really good at that… I’m getting close already.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i7.webm" type="video/webm"></video>
</div>
$playerName holds out under Rebel’s focused attack, then finally lets go with a heavy load. She keeps him buried in her throat until every pulse finishes, then pulls off and shows the thick cum to the camera with clear satisfaction.
<<speech "rebel">>Fuck… look at that. You actually made me work for it.<</speech>>
<<speech "you">>I’m finishing…<</speech>>
<<speech "rebel">>Not yet. I want the camera to see how much you gave me.<</speech>>
<<speech "lulu">>That’s so much…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i8.webm" type="video/webm"></video>
</div>
Rebel pulls Lulu in and feeds her the cum, kissing her deeply so they can share it. Both of them end up smiling with messy mouths.
<<speech "rebel">>Swallow. That’s a good girl.<</speech>>
<<speech "lulu">>It tastes so strong…<</speech>>
<<speech "producer">>Perfect. Now we move to the main set.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i9.webm" type="video/webm"></video>
</div>
The orgy starts. Rebel is on the swing, already being fucked while she pulls $playerName’s cock into her mouth.
<<speech "rebel">>Don’t just stand there. Use me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i10.webm" type="video/webm"></video>
</div>
$playerName wraps a hand around her throat while she’s being fucked by others, making her stroke him at the same time.
<<speech "rebel">>Harder… choke me properly.<</speech>>
<<speech "you">>Like this…?<</speech>>
<<speech "rebel">>I fucking love it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i11.webm" type="video/webm"></video>
</div>
<<speech "rebel">>Slap me. Use my mouth like a toy. Don’t be nice.<</speech>>
$playerName does what she asks — a sharp slap, then feeds his cock back into her mouth and uses her throat.
<<speech "rebel">>Mmmph— yes— just like that—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i12.webm" type="video/webm"></video>
</div>
He pulls out of her mouth, spins her, and starts fucking her in doggy on the swing, driving deep.
<<speech "rebel">>Fuck— that’s it… stretch me. Don’t hold back.<</speech>>
<<speech "you">>You’re… really tight.<</speech>>
<<speech "rebel">>Then ruin me.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close… I don’t know if I can last much longer.<</speech>></span>
<<mgButtons "stamina" 2 "career/swallow/BWC/i12.webm" 2>>
<<elseif $phase == 2>>
He pulls out of her mouth, spins her, and starts fucking her in doggy on the swing, driving deep.
<<speech "rebel">>Fuck— that’s it… stretch me. Don’t hold back.<</speech>>
<<speech "you">>You’re… really tight.<</speech>>
<<speech "rebel">>Then ruin me.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>I’m getting close… I don’t know if I can last much longer.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i13.webm" type="video/webm"></video>
</div>
He flips her into missionary and keeps fucking her hard while she takes another cock in her mouth. Rebel is clearly impressed.
<<speech "rebel">>Goddamn… you’re actually fucking me properly. Most guys don’t last this long with me.<</speech>>
<<speech "you">>I’m trying…<</speech>>
<<speech "rebel">>No… you’re not most guys. Keep going. I want to feel this.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i14.webm" type="video/webm"></video>
</div>
$playerName finally cums deep inside her, pumping a heavy load before slowly pulling out.
<<speech "rebel">>Fuck— fill me… yes— that’s a real load.<</speech>>
<<speech "you">>I’m finishing…<</speech>>
<<speech "rebel">>I felt every pulse… damn.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/i15.webm" type="video/webm"></video>
</div>
Rebel slides off the swing, squats in front of the camera, and starts pushing $playerName’s cum out of her pussy with her fingers. She collects it in her hand, then licks it clean and swallows with a smile.
<<speech "rebel">>My husband is going to love this when I get home. He always eats me out after I shoot… especially when it’s a load this big and from someone who actually knew how to use it.<</speech>>
<<speech "you">>Tell him… it was me.<</speech>>
<<speech "rebel">>Oh I will. He’ll be jealous as fuck. You earned that.<</speech>>
<<speech "producer">>That’s a wrap. Rebecca’s going to be very happy with this one.<</speech>>
<<speech "rebel">>You actually impressed me. Size, stamina, and you fucked me like you meant it. I’ll remember this one.<</speech>>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_rebel"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Story Day5 After Rebel"]]
<<else>>
[[Talk after|Story Day5 After Rebel]]
<</if>>
<</if>><div class="passage-title">Rebel Rhyder & Lulu – 2nd Visit</div>
<<if ndef $sceneId or $sceneId !== "ghs_rebel2" or ndef $phase>>
<<set $sceneId to "ghs_rebel2">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j1.webm" type="video/webm"></video>
</div>
Rebel and Lulu are already naked in the booth, waiting. Both look excited — the first shoot was a hit and they came back for more.
<<speech "rebel">>Told you we’d be back. Rebecca loved the numbers.<</speech>>
<<speech "lulu">>I’m less nervous this time… but still a little.<</speech>>
<<speech "rebel">>Good. Stay a little nervous. It looks better on camera.<</speech>>
<<speech "producer">>Same energy as last time. Let’s go.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j2.webm" type="video/webm"></video>
</div>
The first cock appears. Rebel takes it, works it with practiced ease, and makes him finish in her mouth. She immediately turns and spits the cum straight into Lulu’s open mouth.
<<speech "rebel">>Swallow. Don’t waste it.<</speech>>
<<speech "lulu">>Mmm…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j3.webm" type="video/webm"></video>
</div>
They kiss, sharing the load, both of them smiling as they swallow together.
<<speech "rebel">>That’s how you start a shoot.<</speech>>
<<speech "lulu">>You’re so filthy… I love it.<</speech>>
$playerName’s cock appears.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j4.webm" type="video/webm"></video>
</div>
Lulu attacks it immediately, more confident than last time.
<<speech "lulu">>I remember this one…<</speech>>
<<speech "rebel">>So do I. Don’t be soft with him.<</speech>>
<<speech "you">>You both came back for this?<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j5.webm" type="video/webm"></video>
</div>
Rebel drops to his balls while Lulu focuses on the shaft, both of them working in rhythm.
<<speech "rebel">>Lick right there… yes. Keep that pressure on the head.<</speech>>
<<speech "lulu">>He’s already throbbing…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j6.webm" type="video/webm"></video>
</div>
They both lock onto the head with their tongues and mouths at the same time, trying to force him over.
<<speech "rebel">>Come on… give it to us. I want to watch her take it.<</speech>>
<<speech "lulu">>Please… I want it this time.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>Both of you at once is a lot…<</speech>></span>
<<mgButtons "focus" 2 "career/swallow/BWC/j6.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
They both lock onto the head with their tongues and mouths at the same time, trying to force him over.
<<speech "rebel">>Come on… give it to us. I want to watch her take it.<</speech>>
<<speech "lulu">>Please… I want it this time.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>Both of you at once is a lot…<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j7.webm" type="video/webm"></video>
</div>
Lulu stands up, turns, and sinks down onto $playerName’s cock, taking him inside her pussy.
<<speech "lulu">>Fuck— I wanted this last time…<</speech>>
<<speech "rebel">>Then take it. Ride him properly.<</speech>>
<<speech "you">>She’s… tighter than last time felt.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j8.webm" type="video/webm"></video>
</div>
Rebel watches closely while $playerName fucks Lulu, one hand on her hip, the other occasionally guiding her.
<<speech "rebel">>Look at her face… she’s already losing it.<</speech>>
<<speech "lulu">>It’s so deep— don’t stop—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j9.webm" type="video/webm"></video>
</div>
Rebel reaches down and starts rubbing Lulu’s clit while she’s being fucked. Lulu is openly begging now.
<<speech "lulu">>Please… cum inside me. I want it. I want your cum—<</speech>>
<<speech "rebel">>You heard her. Fill her up.<</speech>>
<<speech "you">>She’s squeezing… hard.<</speech>>
<<mgButtons "technique" 2 "career/swallow/BWC/j9.webm" 2>>
<<elseif $phase == 2>>
<<set $mg_Score2 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
Rebel reaches down and starts rubbing Lulu’s clit while she’s being fucked. Lulu is openly begging now.
<<speech "lulu">>Please… cum inside me. I want it. I want your cum—<</speech>>
<<speech "rebel">>You heard her. Fill her up.<</speech>>
<<speech "you">>She’s squeezing… hard.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j10.webm" type="video/webm"></video>
</div>
$playerName lasts long enough for Lulu to break. She cums hard around him, then he follows, pumping a thick load deep inside her. When he pulls out, a heavy drop of cum falls straight onto Rebel’s waiting tongue. She catches it and swallows with a satisfied smile.
<<speech "lulu">>Fuck— I’m cumming… fill me—!<</speech>>
<<speech "you">>I’m finishing…<</speech>>
<<speech "rebel">>Mmm… even the overflow tastes good.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j11.webm" type="video/webm"></video>
</div>
Rebel immediately leans in and starts licking and sucking $playerName’s cum out of Lulu’s pussy, cleaning her thoroughly.
<<speech "rebel">>I wanted to taste him in you…<</speech>>
<<speech "lulu">>Don’t stop… that feels so good.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j12.webm" type="video/webm"></video>
</div>
Lulu turns and sits on Rebel’s face, grinding down so Rebel can push her tongue deeper and get every last drop.
<<speech "lulu">>Eat it… eat all of it.<</speech>>
<<speech "rebel">>Gladly.<</speech>>
<<speech "producer">>Beautiful. Now we move to the main floor.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j13.webm" type="video/webm"></video>
</div>
They shift to the open studio. Both girls look charged and ready for the group scene.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j14.webm" type="video/webm"></video>
</div>
They start kissing and touching each other, deliberately getting the rest of the talent worked up.
<<speech "rebel">>I want him in my ass this time.<</speech>>
<<speech "lulu">>You’re obsessed with him.<</speech>>
<<speech "rebel">>I have a reason.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j15.webm" type="video/webm"></video>
</div>
Rebel gets on all fours. $playerName lines up and pushes into her ass while she reaches over and plays with Lulu’s pussy.
<<speech "rebel">>Yes… right there. Stretch me.<</speech>>
<<speech "you">>It’s… really tight this way.<</speech>>
<<speech "rebel">>Then open me up.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j16.webm" type="video/webm"></video>
</div>
She’s clearly enjoying every thrust. Other talent joins in, playing with Lulu while Rebel stays locked on $playerName.
<<speech "rebel">>Don’t you dare pull out. I want this one.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j17.webm" type="video/webm"></video>
</div>
He shifts to Lulu for a while, fucking her in missionary while she looks up at him.
<<speech "lulu">>You feel even bigger like this…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j18.webm" type="video/webm"></video>
</div>
Another cock enters Lulu’s mouth while $playerName keeps fucking her.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j19.webm" type="video/webm"></video>
</div>
He goes back to Rebel’s ass. She immediately starts begging.
<<speech "rebel">>Finish in my ass. I want to take it home. My husband is going to eat every drop out of me tonight.<</speech>>
<<speech "you">>You really want him to taste that…?<</speech>>
<<speech "rebel">>I want him to know exactly who fucked his wife better.<</speech>>
<<mgButtons "stamina" 2 "career/swallow/BWC/j19.webm" 3>>
<<elseif $phase == 3>>
He goes back to Rebel’s ass. She immediately starts begging.
<<speech "rebel">>Finish in my ass. I want to take it home. My husband is going to eat every drop out of me tonight.<</speech>>
<<speech "you">>You really want him to taste that…?<</speech>>
<<speech "rebel">>I want him to know exactly who fucked his wife better.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j20.webm" type="video/webm"></video>
</div>
$playerName lasts and then empties a heavy load deep into Rebel’s ass. She pushes back onto him, taking every pulse.
<<speech "rebel">>Yes— fill my ass… fuck, that’s it—<</speech>>
<<speech "you">>I’m finishing… right now.<</speech>>
<<speech "rebel">>I can feel how much you just gave me…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/swallow/BWC/j21.webm" type="video/webm"></video>
</div>
Rebel turns around and cleans his cock with her mouth, tasting the mix of his cum, Lulu’s pussy, and her own ass. She looks up at him with a sharp, calculating smile.
<<speech "rebel">>You’re not just a good fuck. You’re the kind of cock that makes husbands nervous. I want to introduce you to mine. He has connections… and he pays well for the right kind of humiliation.<</speech>>
<<speech "you">>You’re… serious?<</speech>>
<<speech "rebel">>Dead serious. You just filled his wife’s ass. He’ll want to meet the man who did it.<</speech>>
<<speech "producer">>That’s a wrap. Rebecca already texted — she wants more of this pairing.<</speech>>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghs_rebel2"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $swallowSameDayLock to true>>
<<set $gloryholeSwallowCount to ($gloryholeSwallowCount || 0) + 1>>
<<if ndef $swallowIndex>><<set $swallowIndex to 0>><</if>>
<<set $swallowIndex to ($swallowIndex || 0) + 1>>
<<set $expGloryhole to ($expGloryhole || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 95 : 55)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 5 : 2)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Story Day7 After Rebel2"]]
<<else>>
[[Talk after|Story Day7 After Rebel2]]
<</if>>
<</if>><div class="passage-title">Tommy King – Gloryhole Secrets</div>
<<if ndef $sceneId or $sceneId !== "ghx_tommy" or ndef $phase>>
<<set $sceneId to "ghx_tommy">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a1.webm" type="video/webm"></video>
</div>
Tommy is already on her knees in front of the hole when the camera starts. She leans in and starts licking and sucking the first cock with clear experience.
<<speech "tommy">>Mmm… first one of the day.<</speech>>
<<speech "producer">>Keep it sloppy. That’s what this set is for.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a2.webm" type="video/webm"></video>
</div>
She gives it a wet, messy blowjob — spit running down the shaft, eyes half-lidded, completely focused.
<<speech "tommy">>I love when they throb like this…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a3.webm" type="video/webm"></video>
</div>
He finishes on her tongue. She holds it there for a second, letting the camera see it.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a4.webm" type="video/webm"></video>
</div>
She shows the load clearly, then swallows with a small smile.
<<speech "tommy">>Good boy… next.<</speech>>
$playerName’s turn. His cock slides through, still only semi-erect.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a5.webm" type="video/webm"></video>
</div>
Tommy goes quiet for a moment when she sees it. She leans in and starts kissing along the length, almost reverent.
<<speech "tommy">>Oh… look at you. You’re going to be fun.<</speech>>
<<speech "you">>You’re… staring at it pretty hard.<</speech>>
<<speech "tommy">>Because it’s worth staring at.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a6.webm" type="video/webm"></video>
</div>
She takes him into her mouth. The head hits the back of her throat easily. She doesn’t pull away — she just adjusts and keeps going, one hand stroking what she can’t fit yet.
<<speech "tommy">>Fuck… you go so deep so easily.<</speech>>
<<speech "producer">>Let her work. Camera loves this.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a7.webm" type="video/webm"></video>
</div>
She switches to both hands, stroking hard while she gags herself on him, spit everywhere.
<<speech "tommy">>I can take more… don’t hold back on me.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re… really deep. That’s a lot.<</speech>></span>
<<mgButtons "focus" 2 "career/secret/BWC/a7.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
She switches to both hands, stroking hard while she gags herself on him, spit everywhere.
<<speech "tommy">>I can take more… don’t hold back on me.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re… really deep. That’s a lot.<</speech>></span>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a8.webm" type="video/webm"></video>
</div>
She pushes forward until his entire cock disappears down her throat. She holds it there, nose pressed against the wall, swallowing around him.
<<speech "tommy">>Mmmph— all the way…<</speech>>
<<speech "you">>I can feel you swallowing…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a9.webm" type="video/webm"></video>
</div>
She starts moving her head, fucking her own throat with his cock in long, deep strokes. Spit pours down her chin and onto her chest.
<<speech "tommy">>Use my throat… I want it.<</speech>>
<<speech "you">>You’re not making this easy…<</speech>>
<<speech "tommy">>Then give it to me. On my tongue.<</speech>>
<<mgButtons "technique" 3 "career/secret/BWC/a9.webm" 2>>
<<elseif $phase == 2>>
She starts moving her head, fucking her own throat with his cock in long, deep strokes. Spit pours down her chin and onto her chest.
<<speech "tommy">>Use my throat… I want it.<</speech>>
<<speech "you">>You’re not making this easy…<</speech>>
<<speech "tommy">>Then give it to me. On my tongue.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a10.webm" type="video/webm"></video>
</div>
$playerName holds out, then finishes hard on her tongue. She keeps stroking him through it, looking straight into the camera while she milks every drop onto her tongue.
<<speech "tommy">>Mmm— yes… all of it. Right here.<</speech>>
<<speech "you">>I’m finishing…<</speech>>
<<speech "tommy">>I won’t waste any.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a11.webm" type="video/webm"></video>
</div>
She turns fully to the camera, opens her mouth, and plays with the cum on her tongue for a moment before swallowing it cleanly with a smile.
<<speech "tommy">>Mmm… thick.<</speech>>
<<speech "producer">>Perfect. Hold that look.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/a12.webm" type="video/webm"></video>
</div>
The exit interview. Tommy is a mess — chin, chest, and cheeks covered in drool and spit — but she’s smiling and giggling.
<<if $lastScore >= 65>>
<<speech "tommy">>That last one was perfect. Held out while I fucked my own throat with it and then gave me everything right on the tongue. I love when they can actually last.<</speech>>
<<speech "producer">>That’s a wrap. Great set.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "tommy">>Good size, decent hold. I’ve had longer, but he still gave me a solid load.<</speech>>
<<speech "producer">>Wrap it. Usable.<</speech>>
<<else>>
<<speech "tommy">>He was thick, but he didn’t last. Still a fun load.<</speech>>
<<speech "producer">>That’s a wrap. We’ll use what we got.<</speech>>
<</if>>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghx_tommy"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $secretsSameDayLock to true>>
<<if ndef $secretsIndex>><<set $secretsIndex to 0>><</if>>
<<set $secretsIndex to ($secretsIndex || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 140 : 85)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 6 : 3)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 6 : 3)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Secrets"]]
<<else>>
[[Back to Gloryhole Secrets|Gloryhole Secrets]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Lauren Phillips – Gloryhole Secrets</div>
<<if ndef $sceneId or $sceneId !== "ghx_lauren" or ndef $phase>>
<<set $sceneId to "ghx_lauren">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b1.webm" type="video/webm"></video>
</div>
Lauren is already on her knees, clearly impatient. The moment the first cock appears she grabs it and starts sucking without any warm-up.
<<speech "lauren">>Finally… I’ve been waiting for this.<</speech>>
<<speech "producer">>She’s been like this since she walked in. Just let her work.<</speech>>
<<speech "lauren">>Don’t just stand there. Give me something to suck.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b2.webm" type="video/webm"></video>
</div>
She deepthroats almost immediately. When she feels him getting close she pulls back just enough to beg, eyes locked on the hole.
<<speech "lauren">>Come on… don’t hold it back. I want it in my mouth. Right now.<</speech>>
<<speech "producer">>She’s begging already. Camera loves that.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b3.webm" type="video/webm"></video>
</div>
He finishes straight into her mouth. She takes every pulse, holds it for a second, then swallows cleanly.
<<speech "lauren">>Mmm… warm. Good boy. Next.<</speech>>
$playerName’s cock pushes through — already extremely hard.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b4.webm" type="video/webm"></video>
</div>
Lauren goes quiet for a second, then smiles and leans in to lick his balls while she studies the length and thickness.
<<speech "lauren">>Oh… you’re already this hard? And look at the size of you.<</speech>>
<<speech "you">>You’re staring pretty hard yourself.<</speech>>
<<speech "lauren">>I’m going to take my time with this one. You’re not finishing quick if I can help it.<</speech>>
<<speech "producer">>She’s sizing you up. This should be good.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b5.webm" type="video/webm"></video>
</div>
She starts with just the head — sucking hard, then pulling off, then going back again, clearly making a plan.
<<speech "lauren">>I know exactly how I want to break you.<</speech>>
<<speech "you">>That’s… a little intense.<</speech>>
<<speech "lauren">>Oh I will. You’re already twitching.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b6.webm" type="video/webm"></video>
</div>
She keeps teasing — no hands, just her mouth going on and off the head in a slow, deliberate rhythm.
<<speech "lauren">>You’re twitching every time I pull away… I love that.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re doing that on purpose…<</speech>></span>
<<speech "lauren">>I’m not done playing yet. You’re going to wait until I’m ready.<</speech>>
<<speech "producer">>She’s edging him on purpose. Stay with it.<</speech>>
<<mgButtons "focus" 2 "career/secret/BWC/b6.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
She keeps teasing — no hands, just her mouth going on and off the head in a slow, deliberate rhythm.
<<speech "lauren">>You’re twitching every time I pull away… I love that.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re doing that on purpose…<</speech>></span>
<<speech "lauren">>I’m not done playing yet. You’re going to wait until I’m ready.<</speech>>
<<speech "producer">>She’s edging him on purpose. Stay with it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b7.webm" type="video/webm"></video>
</div>
She runs her tongue all over him, focusing on the head, then grips the base hard and smiles up at the hole.
<<speech "lauren">>I can feel your pulse… you’re dying to finish.<</speech>>
<<speech "you">>You’re enjoying this way too much.<</speech>>
<<speech "lauren">>Of course I am. This is my favorite part.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b8.webm" type="video/webm"></video>
</div>
Without warning she forces herself all the way down. The power of her throat actually pushes $playerName back slightly against the wall. She stays there, swallowing around him, still smiling with her eyes.
<<speech "lauren">>Mmmph— all the way…<</speech>>
<<speech "you">>Jesus— that was sudden.<</speech>>
<<speech "lauren">>Stay right there. Don’t you dare pull back.<</speech>>
<<speech "producer">>She just pushed him into the wall. Keep rolling.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b9.webm" type="video/webm"></video>
</div>
She pulls off just long enough to breathe, strings of spit connecting her lips to his cock, then immediately drives herself back down even deeper.
<<speech "lauren">>Again… I can take it.<</speech>>
<<speech "you">>You’re not giving me any room…<</speech>>
<<speech "lauren">>Good.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b10.webm" type="video/webm"></video>
</div>
She switches back to the head and starts sucking it hard and fast, no more teasing — pure intent to finish him.
<<speech "lauren">>You’ve been tortured enough. Give it to me. Right now.<</speech>>
<<speech "you">>I’m… right there.<</speech>>
<<speech "lauren">>I am. Come on… shoot it. I want every drop on my tongue.<</speech>>
<<speech "producer">>She’s done playing. This is the kill shot.<</speech>>
<<mgButtons "stamina" 3 "career/secret/BWC/b10.webm" 2>>
<<elseif $phase == 2>>
She switches back to the head and starts sucking it hard and fast, no more teasing — pure intent to finish him.
<<speech "lauren">>You’ve been tortured enough. Give it to me. Right now.<</speech>>
<<speech "you">>I’m… right there.<</speech>>
<<speech "lauren">>I am. Come on… shoot it. I want every drop on my tongue.<</speech>>
<<speech "producer">>She’s done playing. This is the kill shot.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b11.webm" type="video/webm"></video>
</div>
$playerName finally breaks. He shoots directly into her mouth while she keeps stroking him, milking every drop onto her tongue.
<<speech "lauren">>Yes— fill it… that’s it, all of it. Don’t stop.<</speech>>
<<speech "you">>I’m finishing…<</speech>>
<<speech "lauren">>Not yet. I want the camera to see what you gave me.<</speech>>
<<speech "producer">>Hold it. Perfect.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b12.webm" type="video/webm"></video>
</div>
She turns to the camera, opens her mouth, and shows the heavy load sitting on her tongue before swallowing it with a satisfied smile.
<<speech "lauren">>Mmm… perfect. Thick and warm.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/b13.webm" type="video/webm"></video>
</div>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
Exit interview. Lauren is still on her knees, but she spreads her legs slightly for the camera, clearly worked up and happy.
<<speech "producer">>How are you feeling?<</speech>>
<<if $lastScore >= 65>>
<<speech "lauren">>That thick one was exactly what I wanted. Held out through all the teasing and the deepthroat and still gave me a heavy load right on the tongue. I’m soaked just from sucking him. Look.<</speech>>
<<speech "lauren">>Your fault. Come back and do it again sometime.<</speech>>
<<speech "producer">>That’s a wrap. Great set.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "lauren">>Good size, decent hold. I’ve had longer sessions, but he still finished strong on my tongue.<</speech>>
<<speech "producer">>Wrap it. Usable.<</speech>>
<<else>>
<<speech "lauren">>He was thick, but he didn’t last through the teasing. Still a fun load.<</speech>>
<<speech "producer">>That’s a wrap. We’ll use what we got.<</speech>>
<</if>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghx_lauren"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $secretsSameDayLock to true>>
<<if ndef $secretsIndex>><<set $secretsIndex to 0>><</if>>
<<set $secretsIndex to ($secretsIndex || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 140 : 85)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 6 : 3)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 6 : 3)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Secrets"]]
<<else>>
[[Back to Gloryhole Secrets|Gloryhole Secrets]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Cory Chase – Gloryhole Secrets</div>
<<if ndef $sceneId or $sceneId !== "ghx_cory" or ndef $phase>>
<<set $sceneId to "ghx_cory">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c1.webm" type="video/webm"></video>
</div>
Cory is still fully dressed when she drops to her knees. The first cock appears and she takes it into her mouth immediately, no hesitation.
<<speech "cory">>I’ve been thinking about this all morning.<</speech>>
<<speech "producer">>She’s ready. Let her set the pace.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c2.webm" type="video/webm"></video>
</div>
She works him with steady, practiced focus until he finishes on her tongue. She holds it there and smiles for the camera.
<<speech "cory">>Mmm… there it is.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c3.webm" type="video/webm"></video>
</div>
She shows the load clearly, swallows, then starts stripping right there on her knees, still looking at the camera.
<<speech "cory">>Now I can really enjoy the next ones.<</speech>>
<<speech "producer">>That’s the look we wanted.<</speech>>
$playerName’s cock pushes through.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c4.webm" type="video/webm"></video>
</div>
Cory leans in and teases the head against her nipples, talking softly to it (and to him) with a warm smile.
<<speech "cory">>Look at you… already so hard for me. You’re going to feel so good in my mouth.<</speech>>
<<speech "you">>You’re… talking to it like that.<</speech>>
<<speech "cory">>I like teasing. Especially when they’re this thick.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c5.webm" type="video/webm"></video>
</div>
She starts properly — licking his balls, then taking the shaft into her mouth, slow at first, then deeper.
<<speech "cory">>You taste clean… and heavy. I like that.<</speech>>
<<speech "you">>You’re taking your time with it…<</speech>>
<<speech "cory">>I wasn’t planning on stopping.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c6.webm" type="video/webm"></video>
</div>
She picks up the pace, sucking him hard and relentlessly. The head keeps hitting the back of her throat with every stroke.
<<speech "cory">>I can take it deeper… don’t pull away from me.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re not leaving me much choice…<</speech>></span>
<<speech "cory">>Good. Stay right there.<</speech>>
<<speech "producer">>She’s locked in. Stay with her.<</speech>>
<<mgButtons "focus" 2 "career/secret/BWC/c6.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
She picks up the pace, sucking him hard and relentlessly. The head keeps hitting the back of her throat with every stroke.
<<speech "cory">>I can take it deeper… don’t pull away from me.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re not leaving me much choice…<</speech>></span>
<<speech "cory">>Good. Stay right there.<</speech>>
<<speech "producer">>She’s locked in. Stay with her.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c7.webm" type="video/webm"></video>
</div>
She commits fully — continuous deepthroat, almost no breaks, just long wet strokes that take him to the root every time.
<<speech "cory">>Mmmph— all the way… every time.<</speech>>
<<speech "you">>Every time you go that deep it hits different…<</speech>>
<<speech "cory">>Then use it. I want you to.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c8.webm" type="video/webm"></video>
</div>
She pulls back just enough to stroke him against her tongue while still keeping the head in her mouth, smiling up at the hole. She’s clearly ready to finish him.
<<speech "cory">>You’re close… I can feel it. Give it to me. Right on my tongue.<</speech>>
<<speech "you">>You’re not going to slow down, are you…?<</speech>>
<<speech "cory">>No. Come on… shoot it. I want every drop.<</speech>>
<<speech "producer">>She’s asking for it. This is the money shot.<</speech>>
<<mgButtons "technique" 3 "career/secret/BWC/c8.webm" 2>>
<<elseif $phase == 2>>
She pulls back just enough to stroke him against her tongue while still keeping the head in her mouth, smiling up at the hole. She’s clearly ready to finish him.
<<speech "cory">>You’re close… I can feel it. Give it to me. Right on my tongue.<</speech>>
<<speech "you">>You’re not going to slow down, are you…?<</speech>>
<<speech "cory">>No. Come on… shoot it. I want every drop.<</speech>>
<<speech "producer">>She’s asking for it. This is the money shot.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c9.webm" type="video/webm"></video>
</div>
$playerName finally lets go. Huge ropes shoot onto her tongue while she keeps stroking him, smiling and softly begging for more.
<<speech "cory">>Yes— that’s it… more. Don’t stop. I want all of it.<</speech>>
<<speech "you">>I’m finishing… right on your tongue.<</speech>>
<<speech "cory">>I am… fuck, there’s so much.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c10.webm" type="video/webm"></video>
</div>
She turns to the camera, opens her mouth, and plays with the thick load on her tongue. She gives his cock one last slow suck to clean him, then swallows everything with a soft smile.
<<speech "cory">>Mmm… perfect. Thick and warm.<</speech>>
<<speech "producer">>Show it off a little more. Beautiful.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/c11.webm" type="video/webm"></video>
</div>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
Exit interview. Cory is completely naked now, sitting back slightly and playing with her tits while she talks, still smiling.
<<speech "producer">>How was that for you?<</speech>>
<<if $lastScore >= 65>>
<<speech "cory">>That last one was exactly what I needed. Held out while I worked him as hard as I could and then gave me a huge load right on the tongue. I’m still turned on just thinking about it.<</speech>>
<<speech "cory">>Your fault. Come back and do it again.<</speech>>
<<speech "producer">>That’s a wrap. Great set.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "cory">>Solid. Good size and a decent finish. I wanted a little more time with it, but it worked.<</speech>>
<<speech "producer">>Wrap it. Usable.<</speech>>
<<else>>
<<speech "cory">>Thick, but quick. Still a nice load on the tongue.<</speech>>
<<speech "producer">>That’s a wrap. We’ll use what we got.<</speech>>
<</if>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghx_cory"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $secretsSameDayLock to true>>
<<if ndef $secretsIndex>><<set $secretsIndex to 0>><</if>>
<<set $secretsIndex to ($secretsIndex || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 140 : 85)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 6 : 3)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 6 : 3)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Secrets"]]
<<else>>
[[Back to Gloryhole Secrets|Gloryhole Secrets]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Violet Myers – Gloryhole Secrets</div>
<<if ndef $sceneId or $sceneId !== "ghx_violet" or ndef $phase>>
<<set $sceneId to "ghx_violet">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d1.webm" type="video/webm"></video>
</div>
Violet is sitting on a chair in the booth for the opening interview, already smiling and clearly excited.
<<speech "producer">>Tell the camera how you’re feeling.<</speech>>
<<speech "violet">>I’m so ready. I’ve been thinking about this all week. I just want to get on my knees and get messy.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d2.webm" type="video/webm"></video>
</div>
She pulls her tits out while still sitting. Two hands poke through the holes and start playing with them as she continues talking, laughing softly.
<<speech "violet">>They’re already touching me… fuck, that feels good.<</speech>>
<<speech "producer">>Stay right there. Let them play.<</speech>>
<<speech "violet">>I could sit here all day like this.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d3.webm" type="video/webm"></video>
</div>
She finally drops to her knees and takes the first cock properly, working it with focused, wet strokes.
<<speech "violet">>Mmm… first one. Let’s see what you’ve got.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d4.webm" type="video/webm"></video>
</div>
He finishes with a huge load that spills out of her mouth and onto her chest. She doesn’t even flinch.
<<speech "violet">>Holy shit… that’s a lot.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d5.webm" type="video/webm"></video>
</div>
She calmly licks the cum off her breast and swallows everything with a bright smile.
<<speech "violet">>I wasn’t going to waste that.<</speech>>
<<speech "producer">>Perfect. Next.<</speech>>
$playerName’s cock pushes through, already fully hard.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d6.webm" type="video/webm"></video>
</div>
Violet immediately wraps her hand around him and starts stroking while looking at the camera.
<<speech "violet">>Oh my god… look at this one. He’s so hard already. And thick.<</speech>>
<<speech "you">>You’re staring pretty hard yourself.<</speech>>
<<speech "violet">>I’m going to make a mess with this cock.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d7.webm" type="video/webm"></video>
</div>
She starts soft and wet, coating him in saliva, sucking gently at first while she gets used to the size.
<<speech "violet">>You feel so good in my mouth… I’m going to take my time.<</speech>>
<<speech "you">>You’re going slow on purpose…<</speech>>
<<speech "violet">>You’ll get what you need. Eventually.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d8.webm" type="video/webm"></video>
</div>
She starts pushing him deeper, slowly at first, gagging a little as she forces more of him into her throat, then begins fucking her own throat with his cock.
<<speech "violet">>Mmmph— fuck… it’s so deep.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re forcing it further every time…<</speech>></span>
<<speech "violet">>I am… just give me a second—<</speech>>
<<speech "producer">>She’s committing. Stay with her.<</speech>>
<<mgButtons "focus" 2 "career/secret/BWC/d8.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
She starts pushing him deeper, slowly at first, gagging a little as she forces more of him into her throat, then begins fucking her own throat with his cock.
<<speech "violet">>Mmmph— fuck… it’s so deep.<</speech>>
<span style="color:#ff6b6b"><<speech "you">>You’re forcing it further every time…<</speech>></span>
<<speech "violet">>I am… just give me a second—<</speech>>
<<speech "producer">>She’s committing. Stay with her.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d9.webm" type="video/webm"></video>
</div>
She picks up the pace. His cock makes her drool heavily — spit running down her chin, onto her tits, and all over his shaft. She pulls off to lick his balls, then goes right back.
<<speech "violet">>Look how sloppy you made me… I can barely talk.<</speech>>
<<speech "you">>You’re the one making it this messy…<</speech>>
<<speech "violet">>I know. I like it like this.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d10.webm" type="video/webm"></video>
</div>
The blowjob turns completely filthy. Saliva is everywhere — her body, his cock, the wall. She’s fully committed to the mess.
<<speech "violet">>I love when it gets like this… so fucking wet.<</speech>>
<<speech "producer">>This is exactly what we wanted. Keep going.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d11.webm" type="video/webm"></video>
</div>
She starts using both hands while still deepthroating, clearly trying to finish him now.
<<speech "violet">>I want it… come on. Give me that load. Right on my tongue.<</speech>>
<<speech "you">>You’re not slowing down at all…<</speech>>
<<speech "violet">>I am. Don’t hold back on me.<</speech>>
<<mgButtons "stamina" 3 "career/secret/BWC/d11.webm" 2>>
<<elseif $phase == 2>>
She starts using both hands while still deepthroating, clearly trying to finish him now.
<<speech "violet">>I want it… come on. Give me that load. Right on my tongue.<</speech>>
<<speech "you">>You’re not slowing down at all…<</speech>>
<<speech "violet">>I am. Don’t hold back on me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d12.webm" type="video/webm"></video>
</div>
$playerName finally breaks. He shoots onto her tongue and into her mouth while she keeps stroking. She immediately turns to show the camera the heavy load sitting on her tongue.
<<speech "violet">>Yes— fuck, look at that… so much.<</speech>>
<<speech "you">>I’m finishing… right there.<</speech>>
<<speech "violet">>I am. Every drop.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d13.webm" type="video/webm"></video>
</div>
She swallows, but doesn’t let go of his cock. She keeps stroking and leans in to kiss and lick it clean, clearly not ready to move on.
<<speech "violet">>I really like this one… I don’t want to let go yet.<</speech>>
<<speech "you">>You’re still holding onto it…<</speech>>
<<speech "violet">>Maybe a little.<</speech>>
<<speech "producer">>She can linger for a second. Then next cock.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/d14.webm" type="video/webm"></video>
</div>
<<set $mg_ScoreN to Math.min(100, Math.max(0, Number($mg_Score) || 0))>>
<<silently>>
<<set $lastScore to Math.min(100, Math.max(0, Math.round(
((Number($mg_Score1)||0) + (Number($mg_Score2)||0) + (Number($mg_Score3)||0) + (Number($mg_ScoreN)||0))
/ Math.max(1, ((Number($mg_Score1)||0)?1:0)+((Number($mg_Score2)||0)?1:0)+((Number($mg_Score3)||0)?1:0)+((Number($mg_ScoreN)||0)?1:0))
)))>>
Exit interview. Violet is too worked up to sit still — she’s already using a vibrator while she talks, legs open, clearly chasing an orgasm.
<<speech "producer">>You couldn’t wait until we stopped rolling?<</speech>>
<<if $lastScore >= 65>>
<<speech "violet">>No. That thick one held out and then gave me everything. I’m so fucking turned on I can’t help it. I need to cum.<</speech>>
<<speech "producer">>That’s a wrap whenever she’s done.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "violet">>He was good… I’m still worked up. Could’ve used a longer round, but I’m not complaining.<</speech>>
<<speech "producer">>Wrap when she’s ready.<</speech>>
<<else>>
<<speech "violet">>He finished fast. Still hot enough that I’m not waiting to get off.<</speech>>
<<speech "producer">>That’s a wrap whenever she’s done.<</speech>>
<</if>>
<<if ndef $sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set $sceneCompleted["ghx_violet"] to true>>
<<set $actionsLeft -= 1>>
<<set $studioSameDayLock to true>>
<<set $secretsSameDayLock to true>>
<<if ndef $secretsIndex>><<set $secretsIndex to 0>><</if>>
<<set $secretsIndex to ($secretsIndex || 0) + 1>>
<<set $money += ($lastScore >= 65 ? 140 : 85)>>
<<set $overallStudioRep to ($overallStudioRep || 0) + ($lastScore >= 65 ? 6 : 3)>>
<<set $studioRelation["joy_media"] to ($studioRelation["joy_media"] || 0) + ($lastScore >= 65 ? 6 : 3)>>
<<applyWorkLoad "studio" ($lastScore >= 65 ? "neutral" : "bad")>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Scene report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>><span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span><</if>>
<<if _rd.overallStudioRep>><span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span><</if>>
<<if _rd.actionsLeft>><span class="tag warn"><<print _rd.actionsLeft>> action</span><</if>>
<<if _rd.exhaustion>><span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span><</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Secrets"]]
<<else>>
[[Back to Gloryhole Secrets|Gloryhole Secrets]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Ella Knox – Gloryhole Secrets</div>
<<if ndef $sceneId or $sceneId !== "ghx_ella" or ndef $phase>>
<<set $sceneId to "ghx_ella">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
/* ===================== INTRO ===================== */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e1.webm" type="video/webm"></video>
</div>
Ella is already smiling at the camera. She cups her big natural tits and shakes them slowly, clearly proud of them.
<<speech "ella" "Ella Knox">>Hi… I hope you like these. I do.<</speech>>
<<speech "producer" "Producer">>Show them off a little more. Perfect.<</speech>>
<<speech "ella" "Ella Knox">>They’re all natural. You’re going to see a lot more of them in a minute.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e2.webm" type="video/webm"></video>
</div>
She drops to her knees, grabs the first cock, and puts it straight in her mouth.
<<speech "ella" "Ella Knox">>Mmm… first one. Let’s go.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e3.webm" type="video/webm"></video>
</div>
He finishes with thick ropes straight into her mouth. She takes it all, smiling around him.
<<speech "ella" "Ella Knox">>Good boy… next.<</speech>>
$playerName’s cock pushes through, already fully hard.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e4.webm" type="video/webm"></video>
</div>
Ella doesn’t hesitate. She takes him into her mouth immediately, eyes flicking up toward the hole as she starts working him.
<<speech "ella" "Ella Knox">>Oh… you’re already this hard. And thick.<</speech>>
<<speech "you">>You like it?<</speech>>
<<speech "ella" "Ella Knox">>I’m going to enjoy this one.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e5.webm" type="video/webm"></video>
</div>
She deepthroats him while stroking the base, occasionally pulling off just to look at his cock like she’s deciding exactly how she wants to finish him.
<<speech "ella" "Ella Knox">>You go so deep so easily… I like that.<</speech>>
<<speech "producer" "Producer">>She’s studying him. This should be fun.<</speech>>
/* ——— FOCUS MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e6.webm" type="video/webm"></video>
</div>
She settles into a steady rhythm — deepthroating him continuously while her lips stay locked around the shaft, only pausing to mouth at his balls.
<<speech "ella" "Ella Knox">>I can feel you throbbing every time I take you all the way…<</speech>>
<<speech "you">>Keep going.<</speech>>
<<speech "ella" "Ella Knox">>I wasn’t planning on stopping.<</speech>>
<<mgButtons "focus" 2 "career/secret/BWC/e6.webm" 1>>
<<elseif $phase == 1>>
/* ===================== AFTER FOCUS ===================== */
<<set $focusScore to $mg_Score>>
<<if $focusScore >= 65>>
<<speech "ella" "Ella Knox">>Still so hard… most guys would have finished by now. I like a challenge.<</speech>>
<<else>>
<<speech "ella" "Ella Knox">>Getting close already? I’m not done with you yet.<</speech>>
<</if>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e7.webm" type="video/webm"></video>
</div>
She starts stroking harder while still sucking, using both hand and mouth together.
<<speech "ella" "Ella Knox">>You’re getting even harder in my hand… fuck.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e8.webm" type="video/webm"></video>
</div>
She drops lower and starts sucking on his balls hard, taking them into her mouth one at a time while her hand keeps a tight stroke on his cock.
<<speech "ella" "Ella Knox">>I love these… heavy and full.<</speech>>
<<speech "you">>They’re full for you.<</speech>>
<<speech "ella" "Ella Knox">>Then give it to me when you’re ready.<</speech>>
/* ——— STAMINA MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e9.webm" type="video/webm"></video>
</div>
She worships his balls with her tongue a little longer, then makes her way back up the shaft as she feels him getting close.
<<speech "ella" "Ella Knox">>You’re close… I can tell. I want it on my tongue and my face.<</speech>>
<<speech "you">>Then open up.<</speech>>
<<speech "ella" "Ella Knox">>I’m ready. Give it to me.<</speech>>
<<speech "producer" "Producer">>This is the shot. Let her have it.<</speech>>
<<mgButtons "technique" 3 "career/secret/BWC/e9.webm" 2>>
<<elseif $phase == 2>>
/* ===================== AFTER STAMINA ===================== */
<<set $lastScore to $mg_Score>>
<<if $lastScore >= 65>>
/* SUCCESS */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e10.webm" type="video/webm"></video>
</div>
$playerName holds out, then unloads a huge load onto her tongue and across her face while she keeps stroking him with a bright smile.
<<speech "ella" "Ella Knox">>Yes— fuck, there’s so much… keep going.<</speech>>
<<speech "you">>Take all of it.<</speech>>
<<speech "ella" "Ella Knox">>I am… look at me.<</speech>>
<<else>>
/* FAILURE */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e10.webm" type="video/webm"></video>
</div>
$playerName finishes a little earlier than she wanted. He still covers her tongue and face, and she keeps stroking with a smile, but the build-up was shorter.
<<speech "ella" "Ella Knox">>Already? Okay… I’ve got you. Keep giving it to me.<</speech>>
<<speech "you">>Shit—<</speech>>
<<speech "ella" "Ella Knox">>It’s still a lot. I look good like this.<</speech>>
<</if>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e11.webm" type="video/webm"></video>
</div>
She turns fully to the camera, face and mouth covered, and shows everything with a proud smile before swallowing what’s left on her tongue.
<<speech "ella" "Ella Knox">>Look at the mess you made… I love it.<</speech>>
<<speech "producer" "Producer">>Hold that. Beautiful.<</speech>>
/* ——— SECOND ROUND ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e12.webm" type="video/webm"></video>
</div>
After a while $playerName’s cock appears again. Ella doesn’t even hesitate — she immediately starts sucking him back to full hardness.
<<speech "ella" "Ella Knox">>You’re back… good. I’m not done with this cock.<</speech>>
<<speech "you">>Missed me already?<</speech>>
<<speech "ella" "Ella Knox">>I missed the way you taste.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e13.webm" type="video/webm"></video>
</div>
She works him with mouth and hands, clearly remembering his rhythm from earlier, pushing him toward another finish.
<<speech "ella" "Ella Knox">>I know how you like it now… you’re getting close again, aren’t you?<</speech>>
<<speech "you">>Keep going.<</speech>>
<<speech "ella" "Ella Knox">>This time I want it on my tits.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e14.webm" type="video/webm"></video>
</div>
She leans back, pushes her big tits together, and strokes him until he finishes hard across them, covering both completely.
<<if $lastScore >= 65>>
<<speech "ella" "Ella Knox">>Yes— cover them… fuck, that’s so much. Look at me.<</speech>>
<<speech "you">>You look perfect like that.<</speech>>
<<speech "ella" "Ella Knox">>I know. I love when a cock does this to me.<</speech>>
<<else>>
<<speech "ella" "Ella Knox">>Mmm… still a good load. Cover them for me.<</speech>>
<<speech "you">>Done.<</speech>>
<<speech "ella" "Ella Knox">>I still look good covered in you.<</speech>>
<</if>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/e15.webm" type="video/webm"></video>
</div>
She stays close, licking the cum off her own chest while his cock rests against her face, smiling the whole time.
<<speech "ella" "Ella Knox">>I don’t want to waste any of it… you taste so good.<</speech>>
<<speech "producer" "Producer">>That’s a wrap. She can clean up on camera.<</speech>>
<<speech "you">>You’re filthy.<</speech>>
<<speech "ella" "Ella Knox">>And you love it.<</speech>>
<<silently>>
<<set $sceneCompleted["ghx_ella"] to true>>
<<set $secretsSameDayLock to true>>
<<set $studioSameDayLock to true>>
<<if ($secretsIndex || 0) <= 4>><<set $secretsIndex to 5>><</if>>
<<set $actionsLeft -= 1>> <<set $expGloryhole += 1>> <<set $actressRelation["ella_knox"] to ($actressRelation["ella_knox"] || 0) + ($lastScore >= 65 ? 12 : 6)>> <<set $overallStudioRep += ($lastScore >= 65 ? 7 : 3)>> <<set $studioRelation["joy_media"] += ($lastScore >= 65 ? 7 : 3)>> <<set $money += ($lastScore >= 65 ? 130 : 75)>> <<applyWorkLoad "studio" "neutral">> <<unset $phase>> <<set $mg_Returning to false>> <<set $mg_UsePhase to false>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Secrets"]]
<<else>>
[[Back to Gloryhole Secrets|Gloryhole Secrets]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Nia Nacci – Gloryhole Secrets</div>
<<if ndef $sceneId or $sceneId !== "ghx_nia" or ndef $phase>>
<<set $sceneId to "ghx_nia">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
/* ===================== INTRO ===================== */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f1.webm" type="video/webm"></video>
</div>
Nia pulls her shirt and bra up, showing off her tits to the camera with a confident smile.
<<speech "nia" "Nia Nacci">>You like these? Good. You’re going to see a lot more.<</speech>>
<<speech "producer" "Producer">>She’s in a mood today. Let her cook.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f2.webm" type="video/webm"></video>
</div>
She strips completely, then turns and spreads her pussy and ass for the camera, holding the pose.
<<speech "nia" "Nia Nacci">>I’m ready. Send them through.<</speech>>
<<speech "producer" "Producer">>First ones are coming.<</speech>>
After a few cocks, $playerName’s turn arrives. His fully hard cock pushes through the hole.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f3.webm" type="video/webm"></video>
</div>
Nia’s eyes light up. She immediately starts teasing him — wrapping her tits around the shaft, stroking, and leaning in to suck the head.
<<speech "nia" "Nia Nacci">>Oh hell yes… look at this big white cock. You’re already throbbing.<</speech>>
<<speech "you">>You like what you see?<</speech>>
<<speech "nia" "Nia Nacci">>I’m about to make a mess with it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f4.webm" type="video/webm"></video>
</div>
She tries to deepthroat him, then pulls off, spit connecting her lips to his cock, and keeps stroking while staring at it.
<<speech "nia" "Nia Nacci">>Fuck… you’re thick. I can barely get past the head without gagging.<</speech>>
<<speech "you">>Take more.<</speech>>
<<speech "nia" "Nia Nacci">>I will. Just give me a second to adjust to this thing.<</speech>>
/* ——— FOCUS MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f5.webm" type="video/webm"></video>
</div>
She squeezes his cock tightly between her tits and starts bouncing them, clearly wanting to play more than rush to the finish.
<<speech "nia" "Nia Nacci">>I just want to feel this big white dick between my tits for a while… look at how it disappears.<</speech>>
<<speech "you">>You’re obsessed already.<</speech>>
<<speech "nia" "Nia Nacci">>Can you blame me? Stay hard for me.<</speech>>
<<speech "producer" "Producer">>She’s having fun. Let her play.<</speech>>
<<mgButtons "focus" 2 "career/secret/BWC/f5.webm" 1>>
<<elseif $phase == 1>>
/* ===================== AFTER FOCUS ===================== */
<<set $focusScore to $mg_Score>>
<<if $focusScore >= 65>>
<<speech "nia" "Nia Nacci">>Still rock hard after all that… good. Most white boys would have finished on my tits already.<</speech>>
<<else>>
<<speech "nia" "Nia Nacci">>Getting close already? I’m not done playing with this cock yet.<</speech>>
<</if>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f6.webm" type="video/webm"></video>
</div>
She tries to deepthroat him again, then pulls back and starts stroking hard while looking up, tongue out.
<<speech "nia" "Nia Nacci">>Come on… I want that superior white cum on my tongue. Give it to me.<</speech>>
<<speech "you">>Keep begging.<</speech>>
<<speech "nia" "Nia Nacci">>Please… shoot it. I want to taste you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f7.webm" type="video/webm"></video>
</div>
$playerName finishes. A heavy load lands on her tongue and fills her mouth. She keeps her lips wrapped around him until every pulse is done.
<<speech "nia" "Nia Nacci">>Mmmph— fuck yes… all of it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f8.webm" type="video/webm"></video>
</div>
She stays close, kissing and licking his cock with her mouth still full, talking to the camera around it.
<<speech "nia" "Nia Nacci">>This white cock just filled my mouth… and I’m not even mad about it. Look how much he gave me.<</speech>>
<<speech "producer" "Producer">>Show the camera.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f9.webm" type="video/webm"></video>
</div>
She opens wide, plays with the thick load on her tongue for the camera, then swallows with a satisfied smile.
<<speech "nia" "Nia Nacci">>Perfect. Thick and warm. I want more of that later.<</speech>>
/* ——— SECOND ROUND – FUCKING ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f10.webm" type="video/webm"></video>
</div>
Later, $playerName’s cock appears again, fully hard. The producer leans in.
<<speech "producer" "Producer">>This time I want you to fuck him. Use that pussy.<</speech>>
<<speech "nia" "Nia Nacci">>Gladly. I’ve been thinking about this dick inside me since the first load.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f11.webm" type="video/webm"></video>
</div>
She backs onto the hole and takes him all the way in, then starts moving, fucking herself on his cock.
<<speech "nia" "Nia Nacci">>Fuck— you’re stretching me… this big white cock feels so good.<</speech>>
<<speech "you">>Take every inch.<</speech>>
<<speech "nia" "Nia Nacci">>I am. Don’t you dare pull out.<</speech>>
/* ——— STAMINA MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f12.webm" type="video/webm"></video>
</div>
He keeps fucking her. Her pussy gets visibly creamier around his cock while she reaches down to play with her clit.
<<speech "nia" "Nia Nacci">>Look how creamy you’re making me… keep going. I love this shit.<</speech>>
<<speech "you">>You’re soaking me.<</speech>>
<<speech "nia" "Nia Nacci">>Because this white dick is hitting everything.<</speech>>
<<mgButtons "stamina" 3 "career/secret/BWC/f12.webm" 2>>
<<elseif $phase == 2>>
/* ===================== AFTER STAMINA ===================== */
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f13.webm" type="video/webm"></video>
</div>
She keeps playing with her pussy while he fucks her, openly enjoying every thrust.
<<speech "nia" "Nia Nacci">>Don’t stop… I’m getting close just from your cock alone.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f14.webm" type="video/webm"></video>
</div>
She spreads herself open for the camera while still taking him, showing how wet and stretched she is.
<<speech "nia" "Nia Nacci">>Look at that… your big white cock is wrecking this black pussy and I don’t want you to stop.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f15.webm" type="video/webm"></video>
</div>
She pulls off, drops to her knees, and starts stroking him hard with her tongue out, begging.
<<if $lastScore >= 65>>
<<speech "nia" "Nia Nacci">>Come on… give me that superior white cum again. On my tongue. I earned it.<</speech>>
<<speech "you">>Open up.<</speech>>
<<speech "nia" "Nia Nacci">>I’m ready. Feed me.<</speech>>
<<else>>
<<speech "nia" "Nia Nacci">>You’re close… I can feel it. Give me that white cum on my tongue.<</speech>>
<<speech "you">>Almost—<</speech>>
<<speech "nia" "Nia Nacci">>Don’t hold back. I want it.<</speech>>
<</if>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f16.webm" type="video/webm"></video>
</div>
$playerName finishes on her tongue a second time. She catches as much as she can, smiling the whole time.
<<speech "nia" "Nia Nacci">>Mmm— yes… another load. You’re fucking amazing.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/secret/BWC/f17.webm" type="video/webm"></video>
</div>
She shows the camera the fresh load sitting on her tongue, then swallows it cleanly with a bright smile.
<<if $lastScore >= 65>>
<<speech "nia" "Nia Nacci">>Two loads and you still had something left. I don’t get that often on this floor.<</speech>>
<<speech "you">>Glad it worked.<</speech>>
<<speech "nia" "Nia Nacci">>Mm. Catch me after wrap a second.<</speech>>
<<set $niaDogfartHook to true>>
<<else>>
<<speech "nia" "Nia Nacci">>Still a good set… even if you finished sooner than I wanted the second time. Size was right.<</speech>>
<</if>>
<<speech "producer" "Producer">>That’s a wrap. Strong set.<</speech>>
<<silently>>
<<set $sceneCompleted["ghx_nia"] to true>>
<<set $storyDay3Done to true>>
<<set $forcedMorning to "">>
<<set $unlockedGloryholeSecrets to true>>
<<set $forcedMorning to "">>
<<set $secretsSameDayLock to true>>
<<set $studioSameDayLock to true>>
/* day9 + dogfart in Story Day9 After Nia */
<<set $actionsLeft -= 1>> <<set $expGloryhole += 1>> <<set $actressRelation["nia_nacci"] to ($actressRelation["nia_nacci"] || 0) + ($lastScore >= 65 ? 14 : 7)>> <<set $overallStudioRep += ($lastScore >= 65 ? 8 : 4)>> <<set $studioRelation["joy_media"] += ($lastScore >= 65 ? 8 : 4)>> <<set $money += ($lastScore >= 65 ? 140 : 80)>> <<applyWorkLoad "studio" "neutral">> <<unset $phase>> <<set $mg_Returning to false>> <<set $mg_UsePhase to false>>
<<if $lastScore >= 65>>
<</if>>
<</silently>>
<div class="story-img"><img src="career/pics/story/money handoff.jpg" alt="Producer handing over cash for the shoot" style="width:100%;max-width:700px;height:auto;border-radius:12px;display:block;margin:0.75em 0;box-shadow:0 6px 20px rgba(0,0,0,0.3);" onerror="this.style.display='none'"></div>
After the exit interview wraps, the producer finds you outside the booth. He checks a tablet, then hands you an envelope of cash.
<<if $lastScore >= 65>>
<<speech "producer">>Strong take. Camera loved it. Here’s your full rate for the day.<</speech>>
<<elseif $lastScore >= 50>>
<<speech "producer">>Usable set. We got what we needed. Standard pay.<</speech>>
<<else>>
<<speech "producer">>Not your best — still in the can. Pay’s adjusted. Don’t take it personal; just clean it up next time.<</speech>>
<</if>>
You count it once, nod, and pocket the money.
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Story Day3 After Nia"]]
<<else>>
[[Talk after|Story Day3 After Nia]]
<</if>>
<</if>><div class="passage-title">Japanese Milf – Escort</div>
<<if not $mg_Returning and ndef $phase>>
<<set $sceneId to "esc_japanese">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a1.webm" type="video/webm"></video>
</div>
She’s already waiting in the hotel room when $playerName arrives. The moment the door closes she pulls him in and they start kissing passionately, no small talk.
<<speech "milf" "Japanese Milf">>I don’t have a lot of time… and I don’t want to waste any of it talking.<</speech>>
<<speech "you">>Then we won’t.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a2.webm" type="video/webm"></video>
</div>
He pulls her top off and starts sucking on her breasts. She arches into his mouth, fingers in his hair.
<<speech "milf" "Japanese Milf">>It’s been so long since anyone touched me like this… my husband doesn’t even look at me anymore.<</speech>>
<<speech "you">>His loss.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a3.webm" type="video/webm"></video>
</div>
He lays her back and starts licking her pussy while still fondling her tits. She’s already wet and breathing hard.
<<speech "milf" "Japanese Milf">>Oh god… yes, just like that. Don’t stop.<</speech>>
<<speech "you">>You’re soaked.<</speech>>
<<speech "milf" "Japanese Milf">>I’ve been thinking about this all day… I need to be fucked properly before I go back.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a4.webm" type="video/webm"></video>
</div>
He pushes into her in missionary. The moment he bottoms out her eyes go wide and she starts moaning loudly.
<<speech "milf" "Japanese Milf">>Fuck— it’s so big… I’ve never taken anything like this. My husband is nothing compared to you.<</speech>>
<<speech "you">>Then take it.<</speech>>
<<speech "milf" "Japanese Milf">>I am… don’t be gentle. I want to feel this for days.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a5.webm" type="video/webm"></video>
</div>
He stays on top of her, legs spread wide, driving deep. She grabs his ass and pulls him in harder with every thrust.
<<speech "milf" "Japanese Milf">>Yes… dig into me. I can feel you so deep—<</speech>>
<<speech "you">>You’re gripping me so tight.<</speech>>
<<speech "milf" "Japanese Milf">>Because you’re stretching me open. Don’t stop.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a6.webm" type="video/webm"></video>
</div>
He flips her into doggy, grabs the back of her neck, and starts pushing her back onto his cock. She’s moaning with a clear smile on her face.
<<speech "milf" "Japanese Milf">>Harder… use me. I want to feel owned.<</speech>>
<<speech "you">>Then take every thrust.<</speech>>
<<speech "milf" "Japanese Milf">>I will. Keep going— I needed this so badly.<</speech>>
<<mgButtons "focus" 2 "career/escort/BWC/a4.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to $mg_Score>>
<<unset $phase>>
<<speech "producer" "Producer">>Stay with the camera. Next beat — don't lose the heat.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a6.webm" type="video/webm"></video>
</div>
<<mgButtons "technique" 2 "career/escort/BWC/a6.webm">>
<<else>>
<<set $lastScore to Math.round((($mg_Score1 || $mg_Score) + $mg_Score) / 2)>>
<<unset $mg_Score1>>
<<set $mg_Returning to false>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a7.webm" type="video/webm"></video>
</div>
She climbs on top and starts riding him. He meets her with relentless speed and intensity, hands on her hips.
<<speech "milf" "Japanese Milf">>You’re not holding back at all… fuck, I love it.<</speech>>
<<speech "you">>You asked to be fucked properly.<</speech>>
<<speech "milf" "Japanese Milf">>And you are. Don’t stop.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a8.webm" type="video/webm"></video>
</div>
She suddenly pulls off and drops down to take him into her throat, trying to deepthroat the entire length.
<<speech "milf" "Japanese Milf">>I want to taste you too… let me take it all the way.<</speech>>
<<speech "you">>Open up then.<</speech>>
<<speech "milf" "Japanese Milf">>Mmmph— trying…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a9.webm" type="video/webm"></video>
</div>
They go back to missionary, kissing deeply while he keeps fucking her. She’s completely lost in it, smiling against his mouth as he gets close.
<<speech "milf" "Japanese Milf">>I’m so full… I don’t want this to end yet.<</speech>>
<<speech "you">>I’m getting close.<</speech>>
<<speech "milf" "Japanese Milf">>Then cover my face. I want to feel it. Then keep fucking me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/a10.webm" type="video/webm"></video>
</div>
He pulls out and strokes himself, covering her face with thick ropes. She keeps her eyes open and smiling the whole time. The moment he finishes she pulls him back inside and they keep going.
<<speech "milf" "Japanese Milf">>Yes… look at me. Cover me. Then put it back in— I still need more.<</speech>>
<<speech "you">>You’re insatiable.<</speech>>
<<speech "milf" "Japanese Milf">>I have to go back to a sexless marriage after this. Let me be greedy while I can.<</speech>>
<<silently>>
<<set $sceneCompleted["esc_japanese"] to true>>
<<set $escortSameDayLock to true>>
<<if ($escortIndex || 0) <= 0>><<set $escortIndex to 1>><</if>>
<<if $escortIndex >= 6>><<set $escortStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expEscort += 1>>
<<set $escortJobs += 1>>
<<if $lastScore >= 65>>
<<set $money += 145>>
<<set $escortRep += 8>>
<<set $actressRelation["japanese_milf"] to ($actressRelation["japanese_milf"] || 0) + 6>>
<<else>>
<<set $money += 90>>
<<set $escortRep += 3>>
<<set $actressRelation["japanese_milf"] to ($actressRelation["japanese_milf"] || 0) + 2>>
<</if>>
<<applyWorkLoad "escort" "neutral">>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Escort Agency"]]
<<else>>
[[Back to Escort Agency|Escort Agency]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Cute Pregnant Girl – Escort</div>
<<if not $mg_Returning and ndef $phase>>
<<set $sceneId to "esc_pregnant">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b1.webm" type="video/webm"></video>
</div>
$playerName is already lying on the bed when she comes in. She doesn’t waste time — she pulls his shorts down and immediately starts licking and sucking his cock.
<<speech "pregnant" "Pregnant Woman">>I’ve been thinking about this all week… my husband won’t touch me while I’m like this.<</speech>>
<<speech "you">>His loss.<</speech>>
<<speech "pregnant" "Pregnant Woman">>I just need someone to take care of me. I’m so fucking horny all the time now.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b2.webm" type="video/webm"></video>
</div>
His cock starts growing under her tongue and lips. She looks genuinely impressed as it hardens fully in her mouth.
<<speech "pregnant" "Pregnant Woman">>Oh my god… it’s getting so big. I’ve never seen one like this.<</speech>>
<<speech "you">>Keep going.<</speech>>
<<speech "pregnant" "Pregnant Woman">>I don’t want to stop… it feels so heavy on my tongue.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b3.webm" type="video/webm"></video>
</div>
He pulls her top off while she keeps sucking, not wanting to leave his cock for even a second.
<<speech "pregnant" "Pregnant Woman">>Don’t make me stop… I just want to stay close to it.<</speech>>
<<speech "you">>You’re already addicted.<</speech>>
<<speech "pregnant" "Pregnant Woman">>I think I am. This is nothing like my husband.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b4.webm" type="video/webm"></video>
</div>
She gets on all fours, presenting herself. He pulls her shorts down, lines up, and presses the head against her entrance.
<<speech "pregnant" "Pregnant Woman">>Please… put it in. I’ve been aching for this.<</speech>>
<<speech "you">>You’re already dripping.<</speech>>
<<speech "pregnant" "Pregnant Woman">>I told you… pregnancy makes me like this. Just fuck me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b5.webm" type="video/webm"></video>
</div>
He pushes inside. The moment he fills her she lets out a long, broken moan, face dropping toward the mattress.
<<speech "pregnant" "Pregnant Woman">>Fuck— it’s so deep… I’ve never been stretched like this. I think I’m in love with this cock already.<</speech>>
<<speech "you">>Then take it.<</speech>>
<<speech "pregnant" "Pregnant Woman">>I am… don’t stop. Please don’t stop.<</speech>>
/* ——— STAMINA MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b6.webm" type="video/webm"></video>
</div>
He keeps a steady, continuous rhythm, not giving her any break. She’s moaning into the sheets, completely lost in it.
<<speech "pregnant" "Pregnant Woman">>You’re not stopping… god, I needed this so badly.<</speech>>
<<speech "you">>I’m going to keep fucking you until you can’t think.<</speech>>
<<speech "pregnant" "Pregnant Woman">>Yes… do it. Ruin me for my husband.<</speech>>
<<mgButtons "stamina" 2 "career/escort/BWC/b4.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to $mg_Score>>
<<unset $phase>>
<<speech "producer" "Producer">>Stay with the camera. Next beat — don't lose the heat.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b6.webm" type="video/webm"></video>
</div>
<<mgButtons "focus" 2 "career/escort/BWC/b6.webm">>
<<else>>
<<set $lastScore to Math.round((($mg_Score1 || $mg_Score) + $mg_Score) / 2)>>
<<unset $mg_Score1>>
<<set $mg_Returning to false>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b7.webm" type="video/webm"></video>
</div>
He leans over her, completely burying his cock inside while whispering against her ear. She squeezes around him tightly.
<<speech "you">>You’re gripping me so hard… you never want me to pull out, do you?<</speech>>
<<speech "pregnant" "Pregnant Woman">>I don’t… I want this cock to stay inside me forever. I’m going to think about it every night when he’s not touching me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b8.webm" type="video/webm"></video>
</div>
She suddenly tightens and cums hard on his cock, burying her face into the mattress as the orgasm hits her.
<<speech "pregnant" "Pregnant Woman">>I’m cumming— fuck, I’m cumming on your cock—!<</speech>>
<<speech "you">>That’s it… cum for me.<</speech>>
<<speech "pregnant" "Pregnant Woman">>I can’t stop shaking… it’s so good—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/b9.webm" type="video/webm"></video>
</div>
He pulls out and finishes all over her ass, painting her while she stays in position, still breathing hard.
<<speech "pregnant" "Pregnant Woman">>Yes… cover me. I want to feel it.<</speech>>
<<speech "you">>You’re going to think about this the whole way home.<</speech>>
<<speech "pregnant" "Pregnant Woman">>I already know I will. I don’t know how I’m going to look at my husband after this cock… I’m addicted.<</speech>>
<<silently>>
<<set $sceneCompleted["esc_pregnant"] to true>>
<<set $escortSameDayLock to true>>
<<if ($escortIndex || 0) <= 1>><<set $escortIndex to 2>><</if>>
<<if $escortIndex >= 6>><<set $escortStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expEscort += 1>>
<<set $escortJobs += 1>>
<<if $lastScore >= 65>>
<<set $money += 60>>
<<set $escortRep += 8>>
<<set $actressRelation["pregnant_woman"] to ($actressRelation["pregnant_woman"] || 0) + 6>>
<<else>>
<<set $money += 35>>
<<set $escortRep += 3>>
<<set $actressRelation["pregnant_woman"] to ($actressRelation["pregnant_woman"] || 0) + 2>>
<</if>>
<<applyWorkLoad "escort" "neutral">>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Escort Agency"]]
<<else>>
[[Back to Escort Agency|Escort Agency]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Middle Eastern Milf Tourist – Escort</div>
<<if ndef $sceneId or $sceneId !== "esc_middleeast" or ndef $phase>>
<<set $sceneId to "esc_middleeast">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
/* ===================== INTRO ===================== */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c1.webm" type="video/webm"></video>
</div>
They’re already on the bed, talking between kisses. She’s bold, laughing against his mouth.
<<speech "milf" "Middle Eastern Milf">>I saw the pictures… I came all the way here for this cock. Don’t disappoint me.<</speech>>
<<speech "you">>I don’t plan to.<</speech>>
<<speech "milf" "Middle Eastern Milf">>Good. I’m a party girl back home. I know what I like.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c2.webm" type="video/webm"></video>
</div>
He starts licking and sucking her breasts like he’s starving. She holds his head there, clearly enjoying it.
<<speech "milf" "Middle Eastern Milf">>Yes… just like that. You’re hungry for them, aren’t you?<</speech>>
<<speech "you">>They’re perfect.<</speech>>
<<speech "milf" "Middle Eastern Milf">>Then don’t stop.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c3.webm" type="video/webm"></video>
</div>
He moves down and starts eating her out. She plays with her own nipples while she moans, watching him.
<<speech "milf" "Middle Eastern Milf">>Fuck… your tongue feels so good. Keep going. I want to be dripping before you put it in.<</speech>>
<<speech "you">>You’re already soaked.<</speech>>
<<speech "milf" "Middle Eastern Milf">>I know. I’ve been wet since I booked you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c4.webm" type="video/webm"></video>
</div>
He pushes into her in missionary and starts with strong, intense thrusts. She takes it with a wide smile.
<<speech "milf" "Middle Eastern Milf">>Yes— this is what I wanted. Hard and deep. Don’t be polite with me.<</speech>>
<<speech "you">>You can take it.<</speech>>
<<speech "milf" "Middle Eastern Milf">>I can take more than this. Show me.<</speech>>
/* ——— TECHNIQUE MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c5.webm" type="video/webm"></video>
</div>
He tells her to hold her legs together. The angle makes him go even deeper with every hard thrust. Her eyes widen.
<<speech "you">>Keep your legs closed. Feel how deep I am.<</speech>>
<<speech "milf" "Middle Eastern Milf">>Oh my god— it’s hitting everything… I can’t believe how deep you are.<</speech>>
<<speech "you">>Stay just like that.<</speech>>
<<speech "milf" "Middle Eastern Milf">>I’m trying… fuck, it’s so much.<</speech>>
<<mgButtons "technique" 2 "career/escort/BWC/c5.webm" 1>>
<<elseif $phase == 1>>
/* ===================== AFTER TECHNIQUE ===================== */
<<set $techScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c6.webm" type="video/webm"></video>
</div>
He flips her into doggy and starts fucking her with high intensity and pace. She’s already moaning loudly.
<<speech "milf" "Middle Eastern Milf">>Harder… I can take it. I’ve been fucked a lot, but not like this.<</speech>>
<<speech "you">>Then take every thrust.<</speech>>
<<speech "milf" "Middle Eastern Milf">>I am— fuck—<</speech>>
/* ——— STAMINA MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c7.webm" type="video/webm"></video>
</div>
He grabs a fistful of her hair and keeps the same relentless pace. She cums hard while still being fucked in doggy.
<<speech "milf" "Middle Eastern Milf">>I’m cumming— don’t stop, don’t you dare stop—!<</speech>>
<<speech "you">>Cum on my cock.<</speech>>
<<speech "milf" "Middle Eastern Milf">>I am… fuck, I am—<</speech>>
<<mgButtons "stamina" 2 "career/escort/BWC/c7.webm" 2>>
<<elseif $phase == 2>>
/* ===================== AFTER STAMINA ===================== */
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c8.webm" type="video/webm"></video>
</div>
She collapses onto her stomach, completely sweaty. He stays on top of her and keeps fucking her into the mattress.
<<speech "milf" "Middle Eastern Milf">>You’re still going… I’m so full. I can barely think.<</speech>>
<<speech "you">>I’m not done with you yet.<</speech>>
<<speech "milf" "Middle Eastern Milf">>Good… break me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c9.webm" type="video/webm"></video>
</div>
Another orgasm hits her. Her tongue hangs out and her whole body goes limp while he keeps thrusting. She’s completely broken by the continuous fucking.
<<speech "milf" "Middle Eastern Milf">>I can’t… I’m cumming again— I can’t stop—<</speech>>
<<speech "you">>Then don’t. Keep cumming.<</speech>>
<<speech "milf" "Middle Eastern Milf">>You’re going to ruin me for everyone else…<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c10.webm" type="video/webm"></video>
</div>
He finishes deep inside her without pulling out. She feels every pulse and starts laughing softly in pure satisfaction.
<<speech "milf" "Middle Eastern Milf">>You just came inside me… I can feel it. I’m not on the pill.<</speech>>
<<speech "you">>Shit—<</speech>>
<<speech "milf" "Middle Eastern Milf">>Don’t apologize. I’m happy. I wanted to feel a real load for once.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/c11.webm" type="video/webm"></video>
</div>
He pulls out. She immediately reaches for her phone and hands it to him.
<<speech "milf" "Middle Eastern Milf">>Record my pussy. I want my friends back home to see what a real American cock did to me. I’ll take Plan B later… but first I want proof.<</speech>>
<<speech "you">>You’re serious.<</speech>>
<<speech "milf" "Middle Eastern Milf">>Dead serious. Look how used I am. They’re going to lose their minds.<</speech>>
<<silently>>
<<set $sceneCompleted["esc_middleeast"] to true>>
<<set $escortSameDayLock to true>>
<<if ($escortIndex || 0) <= 2>><<set $escortIndex to 3>><</if>>
<<if $escortIndex >= 6>><<set $escortStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expEscort += 1>>
<<set $escortJobs += 1>>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<<if $lastScore >= 65>>
<<set $money += 160>>
<<set $escortRep += 10>>
<<set $actressRelation["middle_eastern_milf"] to ($actressRelation["middle_eastern_milf"] || 0) + 7>>
<<else>>
<<set $money += 45>>
<<set $escortRep += 4>>
<<set $actressRelation["middle_eastern_milf"] to ($actressRelation["middle_eastern_milf"] || 0) + 3>>
<</if>>
<<applyWorkLoad "escort" "neutral">>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Escort Agency"]]
<<else>>
[[Back to Escort Agency|Escort Agency]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Fat Executive – Escort</div>
<<if not $mg_Returning and ndef $phase>>
<<set $sceneId to "esc_executive">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d1.webm" type="video/webm"></video>
</div>
The moment the door closes he grabs her by the neck and pulls her into a rough kiss. She melts into it immediately.
<<speech "exec" "Fat Executive">>Don’t be gentle with me. I didn’t pay you to be nice.<</speech>>
<<speech "you">>I wasn’t planning on it.<</speech>>
<<speech "exec" "Fat Executive">>Good. I want to be used.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d2.webm" type="video/webm"></video>
</div>
He immediately forces her down onto his cock, gripping her hair and pushing her until her face is completely red and she’s gagging.
<<speech "exec" "Fat Executive">>Mmmph— yes— use my throat—<</speech>>
<<speech "you">>Take it. All of it.<</speech>>
<<speech "exec" "Fat Executive">>Harder… make me red.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d3.webm" type="video/webm"></video>
</div>
He bends her over the bed and starts fucking her from behind. She turns her head and asks for it.
<<speech "exec" "Fat Executive">>Spit on my face. I want it. Please.<</speech>>
<<speech "you">>You really are filthy.<</speech>>
<<speech "exec" "Fat Executive">>I am. Treat me like it.<</speech>>
He spits on her face while he keeps thrusting. She moans louder.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d4.webm" type="video/webm"></video>
</div>
He pushes her face down into the mattress, ass up, and starts spanking her hard while he fucks her.
<<speech "exec" "Fat Executive">>Yes— spank me. Harder. I need it.<</speech>>
<<speech "you">>Your ass is already red.<</speech>>
<<speech "exec" "Fat Executive">>Then make it redder. Don’t stop.<</speech>>
/* ——— TECHNIQUE MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d5.webm" type="video/webm"></video>
</div>
He flips her onto her back and fucks her hard in missionary, one hand around her throat, kissing her roughly. Her face stays flushed and red.
<<speech "exec" "Fat Executive">>Choke me… kiss me while you do it. I want to feel owned.<</speech>>
<<speech "you">>You’re nothing but a hole for me right now.<</speech>>
<<speech "exec" "Fat Executive">>Yes— say it again. Use me.<</speech>>
<<mgButtons "stamina" 2 "career/escort/BWC/d3.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to $mg_Score>>
<<unset $phase>>
<<speech "producer" "Producer">>Stay with the camera. Next beat — don't lose the heat.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d5.webm" type="video/webm"></video>
</div>
<<mgButtons "technique" 2 "career/escort/BWC/d5.webm">>
<<else>>
<<set $lastScore to Math.round((($mg_Score1 || $mg_Score) + $mg_Score) / 2)>>
<<unset $mg_Score1>>
<<set $mg_Returning to false>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d6.webm" type="video/webm"></video>
</div>
She suddenly squirts hard on his cock, legs spreading wide as the orgasm hits her.
<<speech "exec" "Fat Executive">>I’m cumming— fuck, I’m squirting—!<</speech>>
<<speech "you">>Look at that mess. You love being treated like this.<</speech>>
<<speech "exec" "Fat Executive">>I do… I needed this so badly.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d7.webm" type="video/webm"></video>
</div>
Still shaking, she immediately drops back down to suck him clean, eager to please.
<<speech "exec" "Fat Executive">>Let me taste you… I want to make you feel good too.<</speech>>
<<speech "you">>Then get to work.<</speech>>
<<speech "exec" "Fat Executive">>Yes, sir.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d8.webm" type="video/webm"></video>
</div>
She turns around and starts bouncing on his cock. He spanks her ass hard with every drop of her hips.
<<speech "exec" "Fat Executive">>Spank me while I ride you… harder.<</speech>>
<<speech "you">>Your fat ass looks perfect turning red.<</speech>>
<<speech "exec" "Fat Executive">>It’s yours. Use it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d9.webm" type="video/webm"></video>
</div>
She pulls him back into missionary, legs open, looking up at him with clear need.
<<speech "exec" "Fat Executive">>Finish inside me. I want to feel you breeding me. I want your superior cum in my pussy.<</speech>>
<<speech "you">>You want to be filled?<</speech>>
<<speech "exec" "Fat Executive">>Yes. Breed me. Please.<</speech>>
He thrusts deep and finishes hard inside her.
<<speech "exec" "Fat Executive">>Yes— I can feel it… fill me up—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/d10.webm" type="video/webm"></video>
</div>
He pulls out. A thick load immediately starts leaking out of her used pussy.
<<speech "exec" "Fat Executive">>Look at that… you filled me so much. It’s already coming out.<</speech>>
<<speech "you">>You asked to be bred.<</speech>>
<<speech "exec" "Fat Executive">>And you did it perfectly. I needed to be treated like this.<</speech>>
<<silently>>
<<set $sceneCompleted["esc_executive"] to true>>
<<set $escortSameDayLock to true>>
<<if ($escortIndex || 0) <= 3>><<set $escortIndex to 4>><</if>>
<<if $escortIndex >= 6>><<set $escortStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expEscort += 1>>
<<set $escortJobs += 1>>
<<if $lastScore >= 65>>
<<set $money += 150>>
<<set $escortRep += 9>>
<<set $actressRelation["fat_executive"] to ($actressRelation["fat_executive"] || 0) + 6>>
<<else>>
<<set $money += 90>>
<<set $escortRep += 3>>
<<set $actressRelation["fat_executive"] to ($actressRelation["fat_executive"] || 0) + 2>>
<</if>>
<<applyWorkLoad "escort" "neutral">>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Escort Agency"]]
<<else>>
[[Back to Escort Agency|Escort Agency]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Divorced Soccer Mom – Escort</div>
<<if not $mg_Returning and ndef $phase>>
<<set $sceneId to "esc_soccermom">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e1.webm" type="video/webm"></video>
</div>
They’re already on the bed, kissing passionately. She pulls him closer, clearly hungry for it.
<<speech "mom" "Soccer Mom">>I’ve been waiting for a young cock like yours… that’s why I left my husband. He got old. You haven’t.<</speech>>
<<speech "you">>You wanted a young stud.<</speech>>
<<speech "mom" "Soccer Mom">>I wanted someone who can actually fuck me. Call me Mommy while you do it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e2.webm" type="video/webm"></video>
</div>
He plays with her clit and squeezes her breasts while they keep kissing, never breaking contact for long.
<<speech "mom" "Soccer Mom">>Yes… just like that, baby. Touch Mommy everywhere.<</speech>>
<<speech "you">>You’re already so wet, Mommy.<</speech>>
<<speech "mom" "Soccer Mom">>I’ve been wet since I booked you. Don’t make me wait any longer.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e3.webm" type="video/webm"></video>
</div>
He moves down and starts licking her while still holding onto her tits. She moans openly, fingers in his hair.
<<speech "mom" "Soccer Mom">>Good boy… eat Mommy’s pussy. Just like that.<</speech>>
<<speech "you">>You taste so good, Mommy.<</speech>>
<<speech "mom" "Soccer Mom">>Then don’t stop. Mommy needs this.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e4.webm" type="video/webm"></video>
</div>
He pushes into her in missionary and fucks her slowly at first, kissing her the whole time. She wraps her legs around him.
<<speech "mom" "Soccer Mom">>Mmm… young cock feels so much better. Keep kissing Mommy while you fuck her.<</speech>>
<<speech "you">>You feel perfect, Mommy.<</speech>>
<<speech "mom" "Soccer Mom">>Go a little deeper… yes. Just like that.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e5.webm" type="video/webm"></video>
</div>
He turns her into doggy but keeps the affection — kissing her cheek and neck while he thrusts.
<<speech "mom" "Soccer Mom">>That’s it… kiss Mommy while you use her. You’re such a good boy.<</speech>>
<<speech "you">>Anything for you, Mommy.<</speech>>
<<speech "mom" "Soccer Mom">>Then give Mommy what she needs.<</speech>>
/* ——— STAMINA MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e6.webm" type="video/webm"></video>
</div>
She suddenly asks for it harder. He pushes her face down, holds her hands behind her back, and starts fucking her with real force.
<<speech "mom" "Soccer Mom">>Yes— harder. Hold Mommy down and use her. Don’t be soft now.<</speech>>
<<speech "you">>Take it, Mommy. This is what you paid for.<</speech>>
<<speech "mom" "Soccer Mom">>It is… fuck Mommy harder. Ruin her for anyone else.<</speech>>
<<mgButtons "focus" 2 "career/escort/BWC/e4.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to $mg_Score>>
<<unset $phase>>
<<speech "producer" "Producer">>Stay with the camera. Next beat — don't lose the heat.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e6.webm" type="video/webm"></video>
</div>
<<mgButtons "technique" 2 "career/escort/BWC/e6.webm">>
<<else>>
<<set $lastScore to Math.round((($mg_Score1 || $mg_Score) + $mg_Score) / 2)>>
<<unset $mg_Score1>>
<<set $mg_Returning to false>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e7.webm" type="video/webm"></video>
</div>
She climbs on top and starts riding him, showing off her body while leaning down to kiss him.
<<speech "mom" "Soccer Mom">>Look at Mommy… does she look good bouncing on your young cock?<</speech>>
<<speech "you">>You look perfect, Mommy.<</speech>>
<<speech "mom" "Soccer Mom">>Then keep looking. Mommy wants you to remember this.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e8.webm" type="video/webm"></video>
</div>
She lies flat on her stomach. He mounts her from behind and keeps a deep, steady pace while she pushes back against him.
<<speech "mom" "Soccer Mom">>Make Mommy cum again… then fill her or cover her. I want to feel you finish.<</speech>>
<<speech "you">>You’re so tight like this, Mommy.<</speech>>
<<speech "mom" "Soccer Mom">>Because this young cock is stretching me perfectly. Don’t stop.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e9.webm" type="video/webm"></video>
</div>
He pulls out and finishes across her back, painting her while she stays in position, smiling.
<<speech "mom" "Soccer Mom">>Yes… cover Mommy. Good boy.<</speech>>
<<speech "you">>You take it so well, Mommy.<</speech>>
<<speech "mom" "Soccer Mom">>Mommy needed every drop of that young cum.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/e10.webm" type="video/webm"></video>
</div>
They stay close afterward, still kissing and staying in the role-play.
<<speech "mom" "Soccer Mom">>You’re exactly what Mommy left her husband for… young, hard, and willing to call her Mommy while you fuck her stupid.<</speech>>
<<speech "you">>Anytime you need it, Mommy.<</speech>>
<<speech "mom" "Soccer Mom">>I already know I’ll be calling you again. Mommy’s addicted now.<</speech>>
<<silently>>
<<set $sceneCompleted["esc_soccermom"] to true>>
<<set $escortSameDayLock to true>>
<<if ($escortIndex || 0) <= 4>><<set $escortIndex to 5>><</if>>
<<if $escortIndex >= 6>><<set $escortStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expEscort += 1>>
<<set $escortJobs += 1>>
<<if $lastScore >= 65>>
<<set $money += 145>>
<<set $escortRep += 8>>
<<set $actressRelation["soccer_mom"] to ($actressRelation["soccer_mom"] || 0) + 6>>
<<else>>
<<set $money += 90>>
<<set $escortRep += 3>>
<<set $actressRelation["soccer_mom"] to ($actressRelation["soccer_mom"] || 0) + 2>>
<</if>>
<<applyWorkLoad "escort" "neutral">>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Escort Agency"]]
<<else>>
[[Back to Escort Agency|Escort Agency]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Cuckold Couple – Escort</div>
<<if ndef $sceneId or $sceneId !== "esc_cuckold" or ndef $phase>>
<<set $sceneId to "esc_cuckold">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
/* ===================== INTRO ===================== */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f1.webm" type="video/webm"></video>
</div>
The husband is already sitting on the couch when $playerName arrives. The wife walks straight up to him, and they start kissing deeply while the husband watches. $playerName’s hands roam over her body right in front of him.
<<speech "wife" "Wife">>Rebel said you were perfect for us… she wasn’t lying about the size.<</speech>>
<<speech "you">>She told you about me?<</speech>>
<<speech "wife" "Wife">>She told us everything. My husband wanted to see it for himself.<</speech>>
<<speech "husband" "Husband">>Just… do what you came here to do.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f2.webm" type="video/webm"></video>
</div>
She drops to her knees and starts sucking $playerName’s cock, stroking him while looking at her husband.
<<speech "wife" "Wife">>Look at this… this is a real cock. Not like yours.<</speech>>
<<speech "you">>Tell him how it feels.<</speech>>
<<speech "wife" "Wife">>It’s so thick I can barely fit it in my mouth. You could never stretch me like this.<</speech>>
/* ——— FOCUS MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f3.webm" type="video/webm"></video>
</div>
$playerName lays her back and starts fucking her slowly in missionary, kissing her while she gets used to the size. The husband starts stroking himself on the couch.
<<speech "wife" "Wife">>Fuck… go slow at first. You’re so much bigger than him.<</speech>>
<<speech "you">>You’ll take all of it soon enough.<</speech>>
<<speech "wife" "Wife">>I know… I want to. He needs to watch me take every inch.<</speech>>
<<mgButtons "focus" 2 "career/escort/BWC/f3.webm" 1>>
<<elseif $phase == 1>>
/* ===================== AFTER FOCUS ===================== */
<<set $focusScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f4.webm" type="video/webm"></video>
</div>
He turns her into doggy so she’s facing her husband. She looks straight at him while $playerName fucks her from behind.
<<speech "wife" "Wife">>Look at me while he fucks me… look how deep he is. You could never reach there.<</speech>>
<<speech "husband" "Husband">>I can see it…<</speech>>
<<speech "wife" "Wife">>Keep stroking that little thing while a real cock ruins me.<</speech>>
/* ——— TECHNIQUE MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f5.webm" type="video/webm"></video>
</div>
She goes back to sucking $playerName, deliberately showing her ass to her husband while he keeps stroking.
<<speech "wife" "Wife">>Taste how wet you made me… he can only watch.<</speech>>
<<speech "you">>You’re dripping down your thighs.<</speech>>
<<speech "wife" "Wife">>Because this cock actually knows what it’s doing.<</speech>>
<<mgButtons "technique" 2 "career/escort/BWC/f5.webm" 2>>
<<elseif $phase == 2>>
/* ===================== AFTER TECHNIQUE ===================== */
<<set $techScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f6.webm" type="video/webm"></video>
</div>
Back in missionary. She’s fully adjusted now and he’s hitting her spots cleanly. She keeps looking over at her husband.
<<speech "wife" "Wife">>He’s hitting places you never have… I can feel it every single thrust.<</speech>>
<<speech "you">>Your husband is watching you fall apart.<</speech>>
<<speech "wife" "Wife">>Good. I want him to see exactly what he’s missing.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f7.webm" type="video/webm"></video>
</div>
They shift into a side-by-side spooning position. She’s facing her husband while $playerName fucks her from behind, giving him a clear view of his wife being stretched by a much larger cock.
<<speech "wife" "Wife">>Look at his tiny cock… and look at what’s inside me right now. There’s no comparison.<</speech>>
<<speech "husband" "Husband">>I know…<</speech>>
<<speech "wife" "Wife">>Then keep watching. I want you to remember this.<</speech>>
/* ——— STAMINA MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f8.webm" type="video/webm"></video>
</div>
He puts her back into missionary and speeds up. She’s openly begging now.
<<speech "wife" "Wife">>Don’t pull out. Breed me. I want your cum inside me instead of his. Please— fill me up in front of him.<</speech>>
<<speech "you">>You want me to breed your wife right in front of you?<</speech>>
<<speech "husband" "Husband">>…Yes.<</speech>>
<<speech "wife" "Wife">>Then do it. Put a real load in me.<</speech>>
<<mgButtons "stamina" 2 "career/escort/BWC/f8.webm" 3>>
<<elseif $phase == 3>>
/* ===================== AFTER STAMINA ===================== */
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f9.webm" type="video/webm"></video>
</div>
$playerName finishes deep inside her. She keeps her eyes locked on her husband the entire time, feeling every pulse.
<<speech "wife" "Wife">>He’s cumming inside me… I can feel it. You’re watching another man breed your wife.<</speech>>
<<speech "you">>Take every drop.<</speech>>
<<speech "wife" "Wife">>I am. It’s so warm… so much more than you’ve ever given me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f10.webm" type="video/webm"></video>
</div>
She crawls over to her husband, turns around, and presents her freshly creampied pussy to him.
<<speech "wife" "Wife">>You don’t get to fuck it. You only get to stroke that little cock against the mess he left. Look how much is leaking out.<</speech>>
<<speech "husband" "Husband">>It’s everywhere…<</speech>>
<<speech "wife" "Wife">>Because a real man just filled me. Now finish on the outside like the cuck you are.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/escort/BWC/f11.webm" type="video/webm"></video>
</div>
The husband strokes himself against her messy pussy lips until he finishes. His cum mixes with the thick load already leaking out of her.
<<speech "wife" "Wife">>Good boy… you only get to add to his mess. Never go inside again when this cock is available.<</speech>>
<<speech "you">>She’s ruined for you now.<</speech>>
<<speech "wife" "Wife">>I was ruined the moment Rebel sent you over. Thank you for coming.<</speech>>
<<silently>>
<<set $sceneCompleted["esc_cuckold"] to true>>
<<set $escortSameDayLock to true>>
<<if ($escortIndex || 0) <= 5>><<set $escortIndex to 6>><</if>>
<<if $escortIndex >= 6>><<set $escortStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expEscort += 1>>
<<set $escortJobs += 1>>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<<if $lastScore >= 65>>
<<set $money += 175>>
<<set $escortRep += 12>>
<<set $actressRelation["cuckold_wife"] to ($actressRelation["cuckold_wife"] || 0) + 8>>
<<set $rebelCuckoldPath to true>>
<<else>>
<<set $money += 110>>
<<set $escortRep += 5>>
<<set $actressRelation["cuckold_wife"] to ($actressRelation["cuckold_wife"] || 0) + 3>>
<</if>>
<<applyWorkLoad "escort" "neutral">>
<<if $lastScore >= 65>>
<</if>>
<</silently>>
<div style="color:#00e676;">The couple was extremely satisfied. Rebel will hear about this…</div>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Escort Agency"]]
<<else>>
[[Back to Escort Agency|Escort Agency]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Debt Failure – Week 1 (Rebecca)</div>
<<set $sceneId to "debt_week1">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w11.webm" type="video/webm"></video>
</div>
Rebecca doesn’t look angry. She looks pleased. She finishes tying $playerName’s hands behind his back and steps back to admire her work.
<<speech "rebecca" "Rebecca">>You missed this week’s payment. I could have been mean about it… but I’ve been waiting for an excuse like this.<</speech>>
<<speech "you">>Rebecca—<</speech>>
<<speech "rebecca" "Rebecca">>Quiet. Most men with a cock like yours never let anyone take control. Today you don’t get a choice.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w12.webm" type="video/webm"></video>
</div>
She wraps a soft cord around his balls — tight enough to make him feel it, but not enough to truly hurt. She gives a light experimental squeeze and smiles.
<<speech "rebecca" "Rebecca">>Just enough pressure so you stay focused on me. I’m not trying to damage the merchandise… I just want it to listen.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w13.webm" type="video/webm"></video>
</div>
She pushes him forward onto his face, ass up, and starts stroking his cock from behind while the cord keeps a constant light tension on his balls.
<<speech "rebecca" "Rebecca">>Look at you. Completely hard already and I haven’t even done anything serious yet. You’ve been wanting someone to take the power away from you, haven’t you?<</speech>>
<<speech "you">>I…<</speech>>
<<speech "rebecca" "Rebecca">>Don’t answer. Your cock is answering for you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w14.webm" type="video/webm"></video>
</div>
She makes him spread his legs wide and presents his cock. A thick stream of lube pours over the head and runs down the shaft as it swells even more.
<<speech "rebecca" "Rebecca">>There we go… nice and shiny. I want to see every vein while I play with you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w15.webm" type="video/webm"></video>
</div>
She picks up a vibrator and runs it slowly along the underside of his cock, watching it reach full hardness under the teasing.
<<speech "rebecca" "Rebecca">>Most guys who are packing like you refuse to submit. They always want to be the ones in charge. I’ve wanted to do this to a cock this size for years.<</speech>>
<<speech "you">>You’re enjoying this too much.<</speech>>
<<speech "rebecca" "Rebecca">>Of course I am. You’re completely at my mercy and still getting harder. That’s delicious.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w16.webm" type="video/webm"></video>
</div>
The vibrator moves lower, pressing gently against his asshole while her other hand strokes him slow and soft.
<<speech "rebecca" "Rebecca">>Relax. I’m only teasing… for now. Feel that? Every time the vibrator presses, your cock jumps in my hand.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w17.webm" type="video/webm"></video>
</div>
She switches the vibrator to his balls, increasing the intensity while she keeps stroking.
<<speech "rebecca" "Rebecca">>Your balls are so full. I’m going to empty them on my own terms today.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w18.webm" type="video/webm"></video>
</div>
She presses the vibrator more firmly against his hole (still not inserting it) while leaning in to lick and tease the head of his cock with soft, slow tongue strokes.
<<speech "rebecca" "Rebecca">>You’re leaking already. All that power and you’re just a leaking, tied-up mess for me. I love this.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w19.webm" type="video/webm"></video>
</div>
She bends him further, keeps the vibrator pressed to his asshole, and starts stroking him with long, milking pulls — like she’s trying to force the orgasm out of him.
<<speech "rebecca" "Rebecca">>That’s it… let me milk this big cock. You’ve been in control of it your whole life. Today it’s mine.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w110.webm" type="video/webm"></video>
</div>
She makes him lie on his back and hold his own legs up. The vibrator stays pressed against his hole while she strokes his fully erect cock with steady purpose.
<<speech "rebecca" "Rebecca">>Look at you. Legs in the air, hands tied, cock throbbing, and a vibrator teasing your ass. This is better than I imagined.<</speech>>
<<speech "you">>Rebecca… I’m close—<</speech>>
<<speech "rebecca" "Rebecca">>I know. That’s the point.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w111.webm" type="video/webm"></video>
</div>
She doesn’t speed up. She just keeps the same relentless, controlled pace, watching his face the entire time.
<<speech "rebecca" "Rebecca">>Don’t fight it. Cum for me. Show me how much you needed someone to take over.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w112.webm" type="video/webm"></video>
</div>
He finally breaks. Thick ropes shoot across her hands and wrist while the vibrator keeps teasing his hole. Rebecca laughs softly, clearly delighted.
<<speech "rebecca" "Rebecca">>There it is… look at how much you gave me. All that superior cock, completely emptied because I decided it was time.<</speech>>
<<speech "you">>Fuck…<</speech>>
<<speech "rebecca" "Rebecca">>Don’t look so ashamed. You lasted longer than I expected. Next time you miss a payment, I might not be this gentle.<</speech>>
She slowly unties him, still smiling, and wipes her hand on his stomach.
<<speech "rebecca" "Rebecca">>Debt is still owed, by the way. This was just interest. Pay me next week… or we do something more creative.<</speech>>
/* CONSEQUENCES */
<<set $sceneCompleted["debt_week1"] to true>>
<<set $debtPunishmentWeek1 to true>>
<<set $rebeccaDominance += 1>>
<<set $exhaustion to Math.min($exhaustionMax || 10, ($exhaustion || 0) + 1)>>
<<set $actionsLeft -= 1>>
/* Debt is not cleared — this was only the punishment */
<<set $money -= 0>> /* no payment made */
<div class="scene-end danger">
Rebecca had her fun.<br>
Debt is still outstanding.<br>
Exhaustion increased.
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Bedroom Hub"]]
<<else>>
[[Back to Bedroom|Bedroom Hub]]
[[City|City]]
<</if>><div class="passage-title">Debt Failure – Week 2 (Rebecca)</div>
<<set $sceneId to "debt_week2">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w21.webm" type="video/webm"></video>
</div>
$playerName is completely naked, sitting on Rebecca’s lap on the couch. She’s already teasing his balls with light, deliberate strokes while she speaks calmly into his ear.
<<speech "rebecca" "Rebecca">>Second week in a row. I’m not as patient this time.<</speech>>
<<speech "you">>Rebecca, I can explain—<</speech>>
<<speech "rebecca" "Rebecca">>No. You don’t talk much today. You take whatever I do to you without hesitation. Understood?<</speech>>
He hesitates for only a second, then nods.
<<speech "you">>…Understood.<</speech>>
<<speech "rebecca" "Rebecca">>Good boy. Stay quiet and let me play.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w22.webm" type="video/webm"></video>
</div>
She wraps her hand around his cock and starts stroking with firm, deliberate squeezes, watching it harden under her control.
<<speech "rebecca" "Rebecca">>Still gets this hard for me even when you’re being punished. That’s the part I like most.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w23.webm" type="video/webm"></video>
</div>
One hand keeps stroking while the other slides down and starts pressing against his asshole, teasing the rim without pushing inside yet.
<<speech "rebecca" "Rebecca">>Last week I only teased. This week I’m going further. Stay still.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w24.webm" type="video/webm"></video>
</div>
She pushes a finger inside him while continuing to stroke his fully hard cock. He doesn’t pull away. He just watches her hand move.
<<speech "rebecca" "Rebecca">>There we go… accepting it. You’re learning.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w25.webm" type="video/webm"></video>
</div>
She switches hands — stroking with one, fingering him with the other — and looks him in the eyes.
<<speech "rebecca" "Rebecca">>Are you enjoying this?<</speech>>
<<speech "you">>…Yes.<</speech>>
<<speech "rebecca" "Rebecca">>You hesitated. But you still said yes. That tells me everything.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w26.webm" type="video/webm"></video>
</div>
She starts moving her finger more deliberately inside him, curling and pressing while her other hand keeps a steady, relentless stroke on his cock.
<<speech "rebecca" "Rebecca">>Feel that? I’m inside you and you’re still leaking all over my hand. You were made for this, you just never admitted it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w27.webm" type="video/webm"></video>
</div>
His body starts tensing. He tries to pull back slightly as the orgasm builds, but her finger stays buried and her grip on his cock doesn’t loosen. She holds up her phone with her free hand.
<<speech "rebecca" "Rebecca">>Don’t you dare stop. I’m recording this. I want to watch you break later.<</speech>>
<<speech "you">>Rebecca— please— I’m going to—<</speech>>
<<speech "rebecca" "Rebecca">>Then cum. Right now. With my finger in your ass and the camera on you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w28.webm" type="video/webm"></video>
</div>
He can’t hold it. The orgasm hits while her finger is still inside him. She immediately leans down and wraps her mouth around the head, catching most of the load as he pulses.
<<speech "rebecca" "Rebecca">>Mmm… good. Stay still. I’m not done.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/debt/BWC/w29.webm" type="video/webm"></video>
</div>
She grabs him by the jaw, forces his mouth open, and lets the cum she collected drip from her lips into his. Her eyes stay locked on his the entire time.
<<speech "rebecca" "Rebecca">>Swallow it. Every drop. You don’t get to waste what I took from you.<</speech>>
He does. She watches his throat move, then gives a small, satisfied smile and releases his face.
<<speech "rebecca" "Rebecca">>Look at you. Second week and you’re already swallowing your own cum on command. Next time you miss a payment, I won’t be this nice.<</speech>>
<<speech "you">>…Yes, Rebecca.<</speech>>
<<speech "rebecca" "Rebecca">>Debt is still owed. This was just the lesson. Pay me next week… or we go further.<</speech>>
She wipes her fingers on his thigh and stands up, already looking composed again.
/* CONSEQUENCES */
<<set $sceneCompleted["debt_week2"] to true>>
<<set $debtPunishmentWeek2 to true>>
<<set $rebeccaDominance += 2>>
<<set $exhaustion to Math.min($exhaustionMax || 10, ($exhaustion || 0) + 2)>>
<<set $mood to Math.max(0, ($mood || 5) - 1)>>
<<set $actionsLeft -= 1>>
<div class="scene-end danger">
Rebecca went further this time.<br>
Debt is still outstanding.<br>
Exhaustion increased significantly.
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Bedroom Hub"]]
<<else>>
[[Back to Bedroom|Bedroom Hub]]
[[City|City]]
<</if>><div class="passage-title">First Time Camming</div>
<<if not $mg_Returning and ndef $phase>>
<<set $sceneId to "cam_first">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/b1.webm" type="video/webm"></video>
</div>
$playerName is on the bathroom floor, completely hard, stroking slowly for the camera. A few viewers are already watching.
<<speech "you">>You like watching this cock? I’ve been holding out… tell me when you want me to cum.<</speech>>
A tip notification flashes. Someone paid for him to finish on camera.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/b2.webm" type="video/webm"></video>
</div>
He starts stroking harder, chasing the orgasm the tip requested.
<<speech "you">>Alright… you paid for it. I’m not holding back anymore.<</speech>>
<<mgButtons "stamina" 1 "career/cam/BWC/b2.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to $mg_Score>>
<<unset $phase>>
<<speech "producer" "Producer">>Stay with the camera. Next beat — don't lose the heat.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/b2.webm" type="video/webm"></video>
</div>
<<mgButtons "focus" 1 "career/cam/BWC/b2.webm">>
<<else>>
<<set $lastScore to Math.round((($mg_Score1 || $mg_Score) + $mg_Score) / 2)>>
<<unset $mg_Score1>>
<<set $mg_Returning to false>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/b3.webm" type="video/webm"></video>
</div>
He finishes hard, shooting a thick load onto the floor right in front of the camera.
<<speech "you">>Fuck… there it is. Hope that was worth the tip.<</speech>>
<<silently>>
<<set $sceneCompleted["cam_first"] to true>>
<<set $camSameDayLock to true>>
<<if ($camIndex || 0) <= 0>><<set $camIndex to 1>><</if>>
<<if $camIndex >= 4>><<set $camStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expCam += 1>>
<<set $camShows += 1>>
<<if $lastScore >= 65>>
<<set $money += 45>>
<<set $camRep += 4>>
<<set $camTokens += 18>>
<<else>>
<<set $money += 25>>
<<set $camRep += 1>>
<<set $camTokens += 8>>
<</if>>
<<applyWorkLoad "cam" "neutral">>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Cam Setup"]]
<<else>>
[[Back to Cam Setup|Cam Setup]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Cam Show – Toy</div>
<<if not $mg_Returning and ndef $phase>>
<<set $sceneId to "cam_toy">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/a1.webm" type="video/webm"></video>
</div>
$playerName stands in his bedroom, fully hard, stroking slowly while holding a fleshlight in his other hand.
<<speech "you">>You want to see this cock fuck a toy? Subscribe and tip. The more you give, the nastier I get with it.<</speech>>
A subscription notification pops up.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/a2.webm" type="video/webm"></video>
</div>
He lubes up and slides into the toy. It takes him easily. He starts with slow, deep strokes for the camera.
<<speech "you">>Look at that… gliding right in. Feels fucking good.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/a3.webm" type="video/webm"></video>
</div>
He picks up the pace, thrusting harder into the toy while talking to the viewers.
<<speech "you">>This is going to make me cum. If you want to watch it happen, start tipping. Goal’s on screen.<</speech>>
/* ——— STAMINA MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/a4.webm" type="video/webm"></video>
</div>
He’s clearly close now. He slows just enough to keep control while pushing the tip goal.
<<speech "you">>I’m right there… pay the goal or only the people who already donated get to see me finish. Last chance.<</speech>>
<<mgButtons "stamina" 1 "career/cam/BWC/a4.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to $mg_Score>>
<<unset $phase>>
<<speech "producer" "Producer">>Stay with the camera. Next beat — don't lose the heat.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/a4.webm" type="video/webm"></video>
</div>
<<mgButtons "technique" 1 "career/cam/BWC/a4.webm">>
<<else>>
<<set $lastScore to Math.round((($mg_Score1 || $mg_Score) + $mg_Score) / 2)>>
<<unset $mg_Score1>>
<<set $mg_Returning to false>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/a5.webm" type="video/webm"></video>
</div>
He finishes hard, pumping a thick load into and onto the toy while still facing the camera.
<<speech "you">>Fuck… there it is. Thanks to everyone who tipped. You made that load happen.<</speech>>
<<silently>>
<<set $sceneCompleted["cam_toy"] to true>>
<<set $camSameDayLock to true>>
<<if ($camIndex || 0) <= 1>><<set $camIndex to 2>><</if>>
<<if $camIndex >= 4>><<set $camStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expCam += 1>>
<<set $camShows += 1>>
<<if $lastScore >= 65>>
<<set $money += 55>>
<<set $camRep += 5>>
<<set $camTokens += 24>>
<<else>>
<<set $money += 30>>
<<set $camRep += 2>>
<<set $camTokens += 12>>
<</if>>
<<applyWorkLoad "cam" "neutral">>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Cam Setup"]]
<<else>>
[[Back to Cam Setup|Cam Setup]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Cam Show – Fleshlight</div>
<<if not $mg_Returning and ndef $phase>>
<<set $sceneId to "cam_fleshlight">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/c1.webm" type="video/webm"></video>
</div>
$playerName is lying on the bed, stroking his hard cock while holding a fleshlight up for the camera.
<<speech "you">>You want to watch this cock disappear inside a toy? Tip if you want me to start fucking it.<</speech>>
A tip comes in.
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/c2.webm" type="video/webm"></video>
</div>
He slides into the fleshlight and starts thrusting, letting the camera see every stroke.
<<speech "you">>There it is… all the way in. Feels tight.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/c3.webm" type="video/webm"></video>
</div>
He starts moving his hips more deliberately, talking straight to the viewers.
<<speech "you">>Imagine this is your pussy… or your ass. Taking every inch just like this toy is right now.<</speech>>
/* ——— STAMINA MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/c4.webm" type="video/webm"></video>
</div>
He’s getting close. He slows just enough to keep control while pushing for more tips.
<<speech "you">>You want to see me cum inside it? Pay the goal. Tell me if you want it in your pussy or your ass… I’m about to fill this thing either way.<</speech>>
<<mgButtons "stamina" 1 "career/cam/BWC/c4.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to $mg_Score>>
<<unset $phase>>
<<speech "producer" "Producer">>Stay with the camera. Next beat — don't lose the heat.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/c4.webm" type="video/webm"></video>
</div>
<<mgButtons "focus" 1 "career/cam/BWC/c4.webm">>
<<else>>
<<set $lastScore to Math.round((($mg_Score1 || $mg_Score) + $mg_Score) / 2)>>
<<unset $mg_Score1>>
<<set $mg_Returning to false>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/c5.webm" type="video/webm"></video>
</div>
He finishes hard, pumping a thick load deep into the fleshlight while still facing the camera.
<<speech "you">>Fuck… it’s full. Thanks to everyone who tipped. You made me empty it all in there.<</speech>>
<<silently>>
<<set $sceneCompleted["cam_fleshlight"] to true>>
<<set $camSameDayLock to true>>
<<if ($camIndex || 0) <= 2>><<set $camIndex to 3>><</if>>
<<if $camIndex >= 4>><<set $camStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expCam += 1>>
<<set $camShows += 1>>
<<if $lastScore >= 65>>
<<set $money += 55>>
<<set $camRep += 5>>
<<set $camTokens += 25>>
<<else>>
<<set $money += 35>>
<<set $camRep += 2>>
<<set $camTokens += 12>>
<</if>>
<<applyWorkLoad "cam" "neutral">>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Cam Setup"]]
<<else>>
[[Back to Cam Setup|Cam Setup]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Cam Show – Interactive Fleshlight</div>
<<if not $mg_Returning and ndef $phase>>
<<set $sceneId to "cam_interactive">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/d1.webm" type="video/webm"></video>
</div>
$playerName is on the bed with an automatic fleshlight. He holds it in one hand while the camera shows his hard cock sliding in and out under the machine’s control.
<<speech "you">>You control this one. Tip to change speed and depth. Tell me where you want it focused and how hard you want it to stroke me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/d2.webm" type="video/webm"></video>
</div>
First tip comes in. The toy speeds up and focuses on the head.
<<speech "you">>Top of the head, fast… got it. Fuck, that’s sensitive.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/d3.webm" type="video/webm"></video>
</div>
Next tip. The fleshlight takes him deeper, stroking the full length.
<<speech "you">>Deeper now… every inch. You can see it disappearing.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/d4.webm" type="video/webm"></video>
</div>
Another tip. The toy locks onto the head again at high speed. He has to hold it steady with both hands.
<<speech "you">>Back on the head, hard and fast… you’re trying to make me lose it early, aren’t you?<</speech>>
/* ——— STAMINA MINIGAME ——— */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/d5.webm" type="video/webm"></video>
</div>
The final tip goal is met. The fleshlight starts stroking him at full speed and depth. He’s clearly getting close.
<<speech "you">>Goal reached… it’s not stopping. I’m going to cum. Keep watching.<</speech>>
<<mgButtons "stamina" 1 "career/cam/BWC/d5.webm" 1>>
<<elseif $phase == 1>>
<<set $mg_Score1 to $mg_Score>>
<<unset $phase>>
<<speech "producer" "Producer">>Stay with the camera. Next beat — don't lose the heat.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/d5.webm" type="video/webm"></video>
</div>
<<mgButtons "technique" 1 "career/cam/BWC/d5.webm">>
<<else>>
<<set $lastScore to Math.round((($mg_Score1 || $mg_Score) + $mg_Score) / 2)>>
<<unset $mg_Score1>>
<<set $mg_Returning to false>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/cam/BWC/d6.webm" type="video/webm"></video>
</div>
He finishes hard, moaning as the toy milks a huge load out of him on camera.
<<speech "you">>Fuck— there it is… thanks for the control. You made that load happen.<</speech>>
<<silently>>
<<set $sceneCompleted["cam_interactive"] to true>>
<<set $camSameDayLock to true>>
<<if ($camIndex || 0) <= 3>><<set $camIndex to 4>><</if>>
<<if $camIndex >= 4>><<set $camStoryDone to true>><</if>>
<<set $actionsLeft -= 1>>
<<set $expCam += 1>>
<<set $camShows += 1>>
<<if $lastScore >= 65>>
<<set $money += 60>>
<<set $camRep += 6>>
<<set $camTokens += 30>>
<<else>>
<<set $money += 35>>
<<set $camRep += 2>>
<<set $camTokens += 14>>
<</if>>
<<applyWorkLoad "cam" "neutral">>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 80>>
<div class="result-verdict great">🔥 Outstanding — they felt every second.</div>
<<elseif $lastScore >= 65>>
<div class="result-verdict great">✨ Strong take — booking material.</div>
<<elseif $lastScore >= 40>>
<div class="result-verdict ok">Serviceable. Room to dig deeper next time.</div>
<<else>>
<div class="result-verdict rough">Rough cut — stamina and focus need work.</div>
<</if>>
<<set _rd to FT_reportDeltas()>>
<div class="result-tags">
<<if _rd.money>>
<span class="tag money"><<print (_rd.money > 0 ? "+" : "") + _rd.money>> cash</span>
<</if>>
<<if _rd.overallStudioRep>>
<span class="tag rep"><<print (_rd.overallStudioRep > 0 ? "+" : "") + _rd.overallStudioRep>> pro rep</span>
<</if>>
<<if _rd.escortRep>>
<span class="tag rep"><<print (_rd.escortRep > 0 ? "+" : "") + _rd.escortRep>> escort rep</span>
<</if>>
<<if _rd.camRep>>
<span class="tag rep"><<print (_rd.camRep > 0 ? "+" : "") + _rd.camRep>> cam rep</span>
<</if>>
<<if _rd.actionsLeft>>
<span class="tag warn"><<print _rd.actionsLeft>> action</span>
<</if>>
<<if _rd.exhaustion>>
<span class="tag warn"><<print (_rd.exhaustion > 0 ? "+" : "") + _rd.exhaustion>> exhaustion</span>
<</if>>
<<if _rd.mood>>
<span class="tag"><<print (_rd.mood > 0 ? "+" : "") + _rd.mood>> mood</span>
<</if>>
<<if _rd.statFocus>>
<span class="tag"><<print (_rd.statFocus > 0 ? "+" : "") + _rd.statFocus>> focus</span>
<</if>>
<<if _rd.statTechnique>>
<span class="tag"><<print (_rd.statTechnique > 0 ? "+" : "") + _rd.statTechnique>> technique</span>
<</if>>
<<if _rd.statStamina>>
<span class="tag"><<print (_rd.statStamina > 0 ? "+" : "") + _rd.statStamina>> stamina</span>
<</if>>
<<if !_rd.money && !_rd.overallStudioRep && !_rd.escortRep && !_rd.camRep && !_rd.statFocus && !_rd.statTechnique && !_rd.statStamina>>
<span class="tag rep">Session logged</span>
<</if>>
</div>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Cam Setup"]]
<<else>>
[[Back to Cam Setup|Cam Setup]]
[[City|City]]
<</if>>
<</if>><<silently>>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<<unset $mg_Score1>>
<</silently>>
<div class="passage-title">Escort Agency</div>
<div class="story-img"><img src="career/pics/loc/escort_agency.jpg" alt="Escort agency" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<<if not $systemsUnlocked>>
Locked until your career starts.
[[City|City]]
<<elseif $exhaustionLocked>>
Too exhausted to work.
[[City|City]]
<<elseif $actionsLeft < 1>>
No actions left today.
[[City|City]]
<<else>>
<<set _enames = {
"esc_japanese": "Quiet Japanese Client",
"esc_pregnant": "Pregnant Housewife",
"esc_middleeast": "Middle Eastern Client",
"esc_executive": "Hotel Executive",
"esc_soccermom": "Soccer Mom",
"esc_cuckold": "Cuckold Arrangement"
}>>
<<set _eportraits = {
"esc_japanese": "career/pics/avatars/japanese.jpg",
"esc_pregnant": "career/pics/avatars/pregnant.jpg",
"esc_middleeast": "career/pics/avatars/middleeast.jpg",
"esc_executive": "career/pics/avatars/executive.jpg",
"esc_soccermom": "career/pics/avatars/soccermom.jpg",
"esc_cuckold": "career/pics/avatars/wife.jpg"
}>>
<<set _noncuck to ["esc_japanese","esc_pregnant","esc_middleeast","esc_executive","esc_soccermom"]>>
<<set _idx to ($escortIndex || 0)>>
<div class="panel panel-tight">
<div class="panel-title">Bookings</div>
<<if $escortSameDayLock>>
<span class="hint">You already did an escort job today. Sleep to unlock the next booking.</span>
<<else>>
<<if _idx < _noncuck.length>>
<<silently>>
<<set _id to _noncuck[_idx]>>
<<set _name to _enames[_id]>>
<<set _img to (_eportraits[_id] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _id>>
<<set _sess to _idx + 1>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_id) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card is-next'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Booking " + _sess + " · Available" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<div class="scene-card-grid scene-card-grid-single"><<link _cardHtml _spass>><</link>></div>
<div class="hint" style="margin-top:8px;">Story booking <<print (_idx + 1)>> / <<print _noncuck.length>></div>
<<else>>
<<set $escortStoryDone to true>>
<</if>>
<<if $unlockedCuckoldEscort and not $sceneCompleted["esc_cuckold"]>>
<<silently>>
<<set _name to _enames["esc_cuckold"]>>
<<set _img to _eportraits["esc_cuckold"]>>
<<set _cardHtml to "<div class='scene-card is-next'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Special · Available</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<div class="scene-card-grid scene-card-grid-single" style="margin-top:10px;"><<link _cardHtml "Scene esc_cuckold">><</link>></div>
<</if>>
<<if $escortStoryDone>>
<div class="hint" style="margin-top:10px;">Repeatable bookings:</div>
<div class="scene-card-grid">
<<for _id range _noncuck>>
<<silently>>
<<set _name to _enames[_id]>>
<<set _img to (_eportraits[_id] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _id>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_id) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Repeat" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<<link _cardHtml _spass>><</link>>
<</for>>
<<if $unlockedCuckoldEscort and $sceneCompleted["esc_cuckold"]>>
<<silently>>
<<set _name to _enames["esc_cuckold"]>>
<<set _img to _eportraits["esc_cuckold"]>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_sid) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Repeat" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<<link _cardHtml "Scene esc_cuckold">><</link>>
<</if>>
</div>
<</if>>
<</if>>
</div>
<div class="nav-grid">[[City|City]]</div>
<</if>># Vixen Studios
<<if not $unlockedVixen>>
You don’t have access yet.
[[Return to City|City]]
<<else>>
High-end studio. *(Placeholder – scenes later)*
Relation: <<print $studioRelation["vixen"]>>
[[Return to City|City]]
<</if>># Brazzers Studios
<<if not $unlockedBrazzers>>
You don’t have access yet.
[[Return to City|City]]
<<else>>
Major studio. *(Placeholder – scenes later)*
Relation: <<print $studioRelation["brazzers"]>>
[[Return to City|City]]
<</if>># Bang Studios
<<if not $unlockedBang>>
You don’t have access yet.
[[Return to City|City]]
<<else>>
Studio lot. *(Placeholder – scenes later)*
Relation: <<print $studioRelation["bang"]>>
[[Return to City|City]]
<</if>># Deeper Studios
<<if not $unlockedDeeper>>
You don’t have access yet.
[[Return to City|City]]
<<else>>
Prestige studio. *(Placeholder – scenes later)*
Relation: <<print $studioRelation["deeper"]>>
[[Return to City|City]]
<</if>><div class="passage-title">Gym</div>
<div class="story-img"><img src="career/pics/loc/gym.jpg" alt="Gym" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<<if $actionsLeft < 1>>
<span class="hint">No actions left today.</span>
<div class="nav-grid">[[Return to City|City]]</div>
<<else>>
<<set $actionsLeft -= 1>>
A real workout — not for the camera. Sweat, stretch, reset.
<<applyRecovery>>
<div class="reward">Recovery: exhaustion −1, mood +1. Counts as recovery for today.</div>
<div class="hint">Exhaustion $exhaustion / $exhaustionMax · Mood $mood / $moodMax · Actions left $actionsLeft</div>
<<if $cityStars && $cityStars.length > 0>>
<<for _s range $cityStars>>
<<if _s.location === "Gym">>
<div class="panel">You notice <<print _s.id.replace(/_/g, " ")>> nearby.
<<if $actionsLeft >= 1>>
[[Talk|Star Interact][$interactStar to _s.id]]
<</if>>
</div>
<</if>>
<</for>>
<</if>>
<div class="nav-grid">
[[Return to City|City]]
[[Go Home|Bedroom Hub]]
</div>
<</if>><div class="passage-title">Cafe</div>
<div class="story-img"><img src="career/pics/loc/cafe.jpg" alt="Cafe" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<<if $actionsLeft < 1>>
<span class="hint">No actions left today.</span>
<div class="nav-grid">[[Return to City|City]]</div>
<<else>>
<<set $actionsLeft -= 1>>
Slow coffee, soft music, no one asking you to perform.
<<applyRecovery>>
<div class="reward">Recovery: exhaustion −1, mood +1. Counts as recovery for today.</div>
<div class="hint">Exhaustion $exhaustion / $exhaustionMax · Mood $mood / $moodMax · Actions left $actionsLeft</div>
<<if $cityStars && $cityStars.length > 0>>
<<for _s range $cityStars>>
<<if _s.location === "Cafe">>
<div class="panel">You notice <<print _s.id.replace(/_/g, " ")>> nearby.
<<if $actionsLeft >= 1>>
[[Talk|Star Interact][$interactStar to _s.id]]
<</if>>
</div>
<</if>>
<</for>>
<</if>>
<div class="nav-grid">
[[Return to City|City]]
[[Go Home|Bedroom Hub]]
</div>
<</if>><div class="passage-title">Park</div>
<div class="story-img"><img src="career/pics/loc/park.jpg" alt="Park" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<<if $actionsLeft < 1>>
<span class="hint">No actions left today.</span>
<div class="nav-grid">[[Return to City|City]]</div>
<<else>>
<<set $actionsLeft -= 1>>
The park is calm. Fresh air and quiet paths clear your head.
<<applyRecovery>>
<div class="reward">Recovery: exhaustion −1, mood +1. Counts as recovery for today.</div>
<div class="hint">Exhaustion $exhaustion / $exhaustionMax · Mood $mood / $moodMax · Actions left $actionsLeft</div>
<<if $cityStars && $cityStars.length > 0>>
<<for _s range $cityStars>>
<<if _s.location === "Park">>
<div class="panel">You notice <<print _s.id.replace(/_/g, " ")>> nearby.
<<if $actionsLeft >= 1>>
[[Talk|Star Interact][$interactStar to _s.id]]
<</if>>
</div>
<</if>>
<</for>>
<</if>>
<div class="nav-grid">
[[Return to City|City]]
[[Go Home|Bedroom Hub]]
</div>
<</if>><div class="passage-title">Mall</div>
<div class="story-img"><img src="career/pics/loc/mall.jpg" alt="Mall" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<<if $actionsLeft < 1>>
<span class="hint">No actions left today.</span>
<div class="nav-grid">[[Return to City|City]] [[Go Home|Bedroom Hub]]</div>
<<else>>
<<set $actionsLeft -= 1>>
You wander the mall, let the noise wash over you, and stop thinking about sets.
<<applyRecovery>>
<div class="reward">Recovery: exhaustion −1, mood +1. Counts as recovery for today.</div>
<div class="hint">Exhaustion $exhaustion / $exhaustionMax · Mood $mood / $moodMax · Actions left $actionsLeft</div>
<<if $cityStars && $cityStars.length > 0>>
<<for _s range $cityStars>>
<<if _s.location === "Mall">>
<div class="panel">You notice <<print _s.id.replace(/_/g, " ")>> nearby.
<<if $actionsLeft >= 1>>
[[Talk|Star Interact][$interactStar to _s.id]]
<</if>>
</div>
<</if>>
<</for>>
<</if>>
<div class="nav-grid">
[[Return to City|City]]
[[Go Home|Bedroom Hub]]
</div>
<</if>><<set $versionEndSeen to true>>
<<set $versionEndReady to true>>
<div class="passage-title">That’s a wrap — v0.1</div>
<div class="story-img"><img src="career/pics/story/title_card.jpg" alt="A Modern Porn Star" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
You’ve cleared this build of <b>A Modern Porn Star</b>: every studio scene, the escort story line (everything except the cuckold booking), and the cam shows.
Thank you for playing.
This version is free to explore. If you want more scenes, faster updates, and a say in what comes next, consider supporting the game.
<div class="panel">
<div class="panel-title">Support & next update</div>
There’s already a <b>poll running</b> about the <b>next exclusive update</b>. Try a subscription on Patreon or SubscribeStar to support the game, vote on what ships next, and get exclusive builds.
<div class="nav-grid" style="margin-top:12px; flex-direction:column; align-items:flex-start; gap:10px;">
<a href="https://www.patreon.com/RedCupid" target="_blank" rel="noopener">Patreon — patreon.com/RedCupid</a>
<a href="https://subscribestar.adult/redcupid" target="_blank" rel="noopener">SubscribeStar — subscribestar.adult/redcupid</a>
</div>
<div class="dev-links" style="margin-top:12px;">
<a href="https://www.patreon.com/RedCupid" target="_blank" rel="noopener"><img class="dev-badge" src="career/pics/brand/patreon.png" alt="Patreon" style="width:72px;height:auto;"></a>
<a href="https://subscribestar.adult/redcupid" target="_blank" rel="noopener"><img class="dev-badge" src="career/pics/brand/subscribestar.png" alt="SubscribeStar" style="width:72px;height:auto;"></a>
</div>
<div class="dev-by" style="margin-top:10px;">By REDCUPID</div>
</div>
<div class="hint">You can keep playing — cam, repeats, debt, and the cuckold path (when unlocked) are still open.</div>
<div class="nav-grid">
[[Back to Bedroom|Bedroom Hub]]
[[City|City]]
</div><div class="passage-title">Focus Trial (prototype)</div>
<div class="panel">
<div class="panel-title">Does not affect the real game</div>
Click <b>safe</b> pictures for 15 seconds. Unsafe pictures are traps. Higher difficulty = fewer safe pics among more unsafe ones.<br>
<span class="hint">Not in focus mode — normal page layout for testing.</span>
</div>
<div class="nav-grid">
<<link "▶ Play Diff 1 (easier)">><<set $trialFocusDiff to 1>><<goto "Focus Trial Play">><</link>>
<<link "▶ Play Diff 2">><<set $trialFocusDiff to 2>><<goto "Focus Trial Play">><</link>>
<<link "▶ Play Diff 3 (harder)">><<set $trialFocusDiff to 3>><<goto "Focus Trial Play">><</link>>
</div>
<div class="panel">
<div class="panel-title">Background video path</div>
Current: <code><<print $trialFocusVideo || "career/story/t4.webm">></code>
<div class="nav-grid">
<<link "Use t4.webm">><<set $trialFocusVideo to "career/story/t4.webm">><<goto "Focus Trial">><</link>>
<<link "Use sn15.webm">><<set $trialFocusVideo to "career/story/sn15.webm">><<goto "Focus Trial">><</link>>
</div>
</div>
<div class="nav-grid">[[Debug Menu|Debug Menu]] [[Mall|Mall]] [[City|City]]</div><<silently>>
<<if ndef $trialFocusDiff>><<set $trialFocusDiff to 1>><</if>>
<<if ndef $trialFocusVideo or !$trialFocusVideo>><<set $trialFocusVideo to "career/story/t4.webm">><</if>>
<</silently>>
<style>
/* Trial full-page focus (scoped; real Focus game untouched) */
html.ft-trial-fs #ui-bar,
html.ft-trial-fs #ui-bar-body,
html.ft-trial-fs #ui-bar-toggle {
display: none !important;
}
html.ft-trial-fs #story {
margin-left: 0 !important;
margin-right: 0 !important;
width: 100% !important;
max-width: 100% !important;
}
html.ft-trial-fs #passages,
html.ft-trial-fs .passage {
margin: 0 !important;
padding: 0 !important;
max-width: none !important;
width: 100% !important;
}
#ft-trial-stage {
position: fixed;
inset: 0;
z-index: 99980;
width: 100vw;
height: 100vh;
margin: 0;
border: 0;
border-radius: 0;
overflow: hidden;
background: #000;
}
#ft-trial-video {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
background: #000;
}
#ft-trial-field {
position: absolute;
inset: 0;
z-index: 3;
}
.ft-trial-pic {
position: absolute;
object-fit: cover;
border-radius: 12px;
border: 3px solid rgba(255,255,255,0.45);
box-shadow: 0 8px 28px rgba(0,0,0,0.55);
cursor: pointer;
transition: transform 0.12s ease, opacity 0.15s ease, border-color 0.12s ease;
user-select: none;
-webkit-user-drag: none;
}
.ft-trial-pic:hover { transform: scale(1.05); border-color: #fff; }
.ft-trial-pic.hit-safe { border-color: #69f0ae; opacity: 0; pointer-events: none; }
.ft-trial-pic.hit-bad { border-color: #ff5252; opacity: 0.3; pointer-events: none; }
#ft-trial-top {
position: absolute;
top: 14px;
left: 14px;
right: 14px;
z-index: 6;
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 10px;
pointer-events: none;
}
#ft-trial-top .chip {
pointer-events: none;
background: rgba(0,0,0,0.6);
color: #fff;
padding: 8px 14px;
border-radius: 12px;
font-weight: 700;
font-size: 1rem;
text-shadow: 0 1px 4px #000;
border: 1px solid rgba(186,85,211,0.35);
}
#ft-trial-bottom {
position: absolute;
left: 0;
right: 0;
bottom: 18px;
z-index: 6;
display: flex;
justify-content: center;
align-items: center;
gap: 12px;
pointer-events: none;
}
#ft-trial-bottom button {
pointer-events: auto;
padding: 10px 18px;
border-radius: 999px;
border: 1px solid rgba(186,85,211,0.5);
background: rgba(20,12,28,0.75);
color: #f3e5f5;
font-weight: 700;
font-size: 0.95rem;
cursor: pointer;
}
#ft-trial-bottom button:hover {
background: rgba(186,85,211,0.35);
}
#ft-trial-bottom button.is-on {
border-color: rgba(105,240,174,0.55);
color: #b9f6ca;
}
#ft-trial-start {
position: absolute;
inset: 0;
z-index: 8;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 14px;
background: rgba(8,4,14,0.55);
color: #f3e5f5;
text-align: center;
padding: 24px;
}
#ft-trial-start h3 {
margin: 0;
font-size: 1.6rem;
color: #e1bee7;
text-shadow: 0 2px 12px #000;
}
#ft-trial-start p {
margin: 0;
max-width: 420px;
line-height: 1.5;
opacity: 0.95;
text-shadow: 0 1px 6px #000;
}
#ft-trial-start-btn {
margin-top: 8px;
padding: 16px 40px;
font-size: 1.2rem;
font-weight: 700;
border-radius: 999px;
border: 1px solid #ba55d3;
background: rgba(186,85,211,0.6);
color: #fff;
cursor: pointer;
box-shadow: 0 10px 32px rgba(0,0,0,0.5);
}
#ft-trial-start-btn:hover { background: rgba(186,85,211,0.8); }
#ft-trial-end {
position: absolute;
inset: 0;
z-index: 9;
display: none;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
background: rgba(8,4,14,0.72);
color: #fff;
text-align: center;
padding: 24px;
}
#ft-trial-end .big {
font-size: 2.6rem;
font-weight: 800;
color: #e1bee7;
}
#ft-trial-end-nav {
display: flex;
flex-wrap: wrap;
gap: 10px;
justify-content: center;
margin-top: 8px;
}
#ft-trial-end-nav a, #ft-trial-end-nav button {
padding: 10px 18px;
border-radius: 999px;
border: 1px solid rgba(255,255,255,0.3);
background: rgba(255,255,255,0.08);
color: #fff;
font-weight: 600;
cursor: pointer;
text-decoration: none;
}
</style>
<div id="ft-trial-stage">
<video id="ft-trial-video" autoplay loop muted playsinline>
<source @src="$trialFocusVideo" type="video/webm">
</video>
<div id="ft-trial-field"></div>
<div id="ft-trial-top">
<div class="chip">Safe <b id="ft-trial-safe">0</b> · Miss <b id="ft-trial-miss">0</b></div>
<div class="chip">Diff <<print $trialFocusDiff>> · ⏱ <b id="ft-trial-time">15.0</b>s</div>
</div>
<div id="ft-trial-bottom">
<button type="button" id="ft-trial-mute-btn">🔇 Unmute</button>
<button type="button" id="ft-trial-pleasure-btn" title="Placeholder">Pleasure score: —</button>
</div>
<div id="ft-trial-start">
<h3>Focus Trial</h3>
<p>Click <b>safe</b> pictures in 15 seconds. Unsafe lower your score.<br>Any click reshuffles the whole board — some leave, new ones appear.</p>
<p>Difficulty <<print $trialFocusDiff>> — no overlaps · no image repeats · fewer safe than unsafe.</p>
<button type="button" id="ft-trial-start-btn">▶ Start</button>
</div>
<div id="ft-trial-end">
<div>Result</div>
<div class="big" id="ft-trial-score">0%</div>
<div id="ft-trial-summary"></div>
<div id="ft-trial-end-nav">
<button type="button" id="ft-trial-again">Again</button>
<button type="button" id="ft-trial-menu">Change difficulty</button>
<button type="button" id="ft-trial-exit">Exit</button>
</div>
</div>
</div>
<<script>>
(function () {
function boot() {
var stage = document.getElementById("ft-trial-stage");
if (!stage || stage.dataset.booted) return;
stage.dataset.booted = "1";
try { if (window.FT_uiBar) FT_uiBar.remember(); } catch (e) {}
document.documentElement.classList.add("ft-trial-fs");
try {
if (typeof UIBar !== "undefined" && UIBar.stow) UIBar.stow(true);
} catch (e) {}
var diff = Number(State.variables.trialFocusDiff) || 1;
var safeImages = [
"career/pics/safe/s1.jpg","career/pics/safe/s2.jpg","career/pics/safe/s3.jpg","career/pics/safe/s4.jpg","career/pics/safe/s5.jpg",
"career/pics/safe/s6.jpg","career/pics/safe/s7.jpg","career/pics/safe/s8.jpg","career/pics/safe/s9.jpg","career/pics/safe/s10.jpg",
"career/pics/safe/s11.jpg","career/pics/safe/s12.jpg","career/pics/safe/s13.jpg","career/pics/safe/s14.jpg","career/pics/safe/s15.jpg",
"career/pics/safe/s16.jpg","career/pics/safe/s17.jpg","career/pics/safe/s18.jpg","career/pics/safe/s19.jpg","career/pics/safe/s20.jpg"
];
var badImages = [
"career/pics/unsafe/n1.jpg","career/pics/unsafe/n2.jpg","career/pics/unsafe/n3.jpg","career/pics/unsafe/n4.jpg","career/pics/unsafe/n5.jpg",
"career/pics/unsafe/n6.jpg","career/pics/unsafe/n7.jpg","career/pics/unsafe/n8.jpg","career/pics/unsafe/n9.jpg","career/pics/unsafe/n10.jpg",
"career/pics/unsafe/n11.jpg","career/pics/unsafe/n12.jpg","career/pics/unsafe/n13.jpg","career/pics/unsafe/n14.jpg","career/pics/unsafe/n15.jpg",
"career/pics/unsafe/n16.jpg","career/pics/unsafe/n17.jpg","career/pics/unsafe/n18.jpg","career/pics/unsafe/n19.jpg","career/pics/unsafe/n20.jpg"
];
var configs = {
1: { startSafe: 2, startBad: 4, minSafe: 1, minBad: 3, maxSafe: 3, maxBad: 6, maxW: 200, maxH: 250 },
2: { startSafe: 2, startBad: 5, minSafe: 1, minBad: 4, maxSafe: 3, maxBad: 7, maxW: 200, maxH: 250 },
3: { startSafe: 1, startBad: 6, minSafe: 1, minBad: 4, maxSafe: 2, maxBad: 8, maxW: 200, maxH: 250 }
};
var cfg = configs[diff] || configs[1];
var field = document.getElementById("ft-trial-field");
var timeEl = document.getElementById("ft-trial-time");
var safeEl = document.getElementById("ft-trial-safe");
var missEl = document.getElementById("ft-trial-miss");
var startLayer = document.getElementById("ft-trial-start");
var endLayer = document.getElementById("ft-trial-end");
var scoreEl = document.getElementById("ft-trial-score");
var summaryEl = document.getElementById("ft-trial-summary");
var startBtn = document.getElementById("ft-trial-start-btn");
var muteBtn = document.getElementById("ft-trial-mute-btn");
var pleasureBtn = document.getElementById("ft-trial-pleasure-btn");
var video = document.getElementById("ft-trial-video");
if (video) {
var vpath = State.variables.trialFocusVideo || "career/story/t4.webm";
var srcEl = video.querySelector("source");
if (srcEl) {
srcEl.setAttribute("src", vpath);
video.load();
}
try { video.muted = true; video.play(); } catch (err) {}
}
var safeHits = 0, badHits = 0;
var running = false;
var timeLeft = 15;
var tickTimer = null;
var soundOn = false;
var usedSafe = {};
var usedBad = {};
var placedBoxes = [];
function rand(a, b) { return a + Math.random() * (b - a); }
function shuffle(a) {
var arr = a.slice();
for (var i = arr.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var t = arr[i]; arr[i] = arr[j]; arr[j] = t;
}
return arr;
}
function pickUnused(pool, usedMap) {
var opts = pool.filter(function (s) { return !usedMap[s]; });
if (!opts.length) {
Object.keys(usedMap).forEach(function (k) { delete usedMap[k]; });
opts = pool.slice();
}
if (!opts.length) return pool[0];
var src = opts[Math.floor(Math.random() * opts.length)];
usedMap[src] = true;
return src;
}
function overlaps(a, b, pad) {
return !(a.r + pad < b.l || a.l - pad > b.r || a.b + pad < b.t || a.t - pad > b.b);
}
function countSafeOnField() {
if (!field) return 0;
var n = 0, nodes = field.querySelectorAll(".ft-trial-pic");
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].dataset.safe === "1" && !nodes[i].dataset.dead) n++;
}
return n;
}
function countBadOnField() {
if (!field) return 0;
var n = 0, nodes = field.querySelectorAll(".ft-trial-pic");
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].dataset.safe !== "1" && !nodes[i].dataset.dead) n++;
}
return n;
}
function removeBoxFor(img) {
placedBoxes = placedBoxes.filter(function (b) { return b.el !== img; });
}
function placePic(isSafe, force) {
if (!running || !field) return false;
force = !!force;
if (!force) {
if (isSafe && countSafeOnField() >= cfg.maxSafe) return false;
if (!isSafe && countBadOnField() >= cfg.maxBad) return false;
if (isSafe && countSafeOnField() >= 1 && countBadOnField() > 0 && countSafeOnField() >= countBadOnField()) {
return false;
}
}
var maxW = cfg.maxW || 200;
var maxH = cfg.maxH || 250;
var src = isSafe ? pickUnused(safeImages, usedSafe) : pickUnused(badImages, usedBad);
var img = document.createElement("img");
img.className = "ft-trial-pic";
img.alt = isSafe ? "safe" : "unsafe";
img.dataset.safe = isSafe ? "1" : "0";
img.style.objectFit = "contain";
img.style.display = "block";
img.style.position = "absolute";
function commitPlace(nw, nh) {
var rect = field.getBoundingClientRect();
var maxL = Math.max(8, rect.width - nw - 8);
var maxT = Math.max(56, rect.height - nh - 80);
var attempts = force ? 60 : 35;
var pad = force ? 4 : 10;
for (var tries = 0; tries < attempts; tries++) {
var L = maxL <= 8 ? 8 : rand(8, maxL);
var T = maxT <= 56 ? 56 : rand(56, maxT);
var box = { l: L, t: T, r: L + nw, b: T + nh, el: img };
var ok = true;
for (var i = 0; i < placedBoxes.length; i++) {
if (overlaps(box, placedBoxes[i], pad)) { ok = false; break; }
}
if (ok) {
img.style.left = L + "px";
img.style.top = T + "px";
img.style.width = nw + "px";
img.style.height = nh + "px";
placedBoxes.push(box);
return true;
}
}
if (force) {
var L2 = Math.max(8, (rect.width - nw) * 0.5);
var T2 = Math.max(56, (rect.height - nh) * 0.35);
img.style.left = L2 + "px";
img.style.top = T2 + "px";
img.style.width = nw + "px";
img.style.height = nh + "px";
placedBoxes.push({ l: L2, t: T2, r: L2 + nw, b: T2 + nh, el: img });
return true;
}
return false;
}
function onReady() {
var nw = img.naturalWidth || maxW;
var nh = img.naturalHeight || maxH;
var scale = Math.min(maxW / nw, maxH / nh);
nw = Math.max(1, Math.round(nw * scale));
nh = Math.max(1, Math.round(nh * scale));
if (!commitPlace(nw, nh)) {
if (img.parentNode) img.parentNode.removeChild(img);
return;
}
}
img.addEventListener("click", function (e) {
e.preventDefault();
e.stopPropagation();
if (!running || img.dataset.dead) return;
img.dataset.dead = "1";
if (img.dataset.safe === "1") {
safeHits++;
if (safeEl) safeEl.textContent = String(safeHits);
if (pleasureBtn) pleasureBtn.textContent = "Pleasure score: " + Math.min(100, safeHits * 14) + "%";
} else {
badHits++;
if (missEl) missEl.textContent = String(badHits);
}
reshuffleBoard();
});
field.appendChild(img);
img.onload = onReady;
img.onerror = function () {
/* fallback box if file missing */
if (!commitPlace(Math.min(maxW, 160), Math.min(maxH, 200))) {
if (img.parentNode) img.parentNode.removeChild(img);
}
};
img.src = src;
/* if cached, onload may have already fired */
if (img.complete && img.naturalWidth) onReady();
return true;
}
function ensureOneSafe() {
if (countSafeOnField() < 1) {
placePic(true, true);
}
}
function reshuffleBoard() {
if (!running || !field) return;
field.innerHTML = "";
placedBoxes = [];
var maxS = cfg.maxSafe;
var maxB = cfg.maxBad;
var badTarget = cfg.minBad + Math.floor(Math.random() * (maxB - cfg.minBad + 1));
if (badTarget < 2) badTarget = 2;
var safeCap = Math.min(maxS, badTarget - 1);
var safeTarget = Math.max(1, cfg.minSafe + Math.floor(Math.random() * Math.max(1, safeCap - cfg.minSafe + 1)));
if (safeTarget >= badTarget) safeTarget = Math.max(1, badTarget - 1);
var i;
/* SAFE FIRST so it never loses the space race to unsafer */
for (i = 0; i < safeTarget; i++) placePic(true, i === 0);
for (i = 0; i < badTarget; i++) placePic(false, false);
ensureOneSafe();
}
function finish() {
running = false;
clearInterval(tickTimer);
if (field) field.innerHTML = "";
placedBoxes = [];
var score = Math.max(0, Math.min(100, Math.round(safeHits * 14 - badHits * 6.5)));
if (scoreEl) scoreEl.textContent = score + "%";
if (summaryEl) {
summaryEl.textContent = "Safe: " + safeHits + " · Unsafe clicks: " + badHits + " · Diff " + diff;
}
if (pleasureBtn) pleasureBtn.textContent = "Pleasure score: " + score + "%";
if (endLayer) endLayer.style.display = "flex";
State.variables.trialFocusLastScore = score;
if (State.variables.mg_ProductionLaunch) {
State.variables.mg_ProductionLaunch = false;
cleanup();
if (typeof FT_finishMinigame === "function") {
setTimeout(function () { FT_finishMinigame(score); }, 400);
}
return;
}
}
function startGame() {
if (startLayer) startLayer.style.display = "none";
if (endLayer) endLayer.style.display = "none";
running = true;
safeHits = 0;
badHits = 0;
timeLeft = 15;
usedSafe = {};
usedBad = {};
placedBoxes = [];
if (safeEl) safeEl.textContent = "0";
if (missEl) missEl.textContent = "0";
if (timeEl) timeEl.textContent = "15.0";
if (pleasureBtn) pleasureBtn.textContent = "Pleasure score: —";
if (field) field.innerHTML = "";
if (video) {
try { video.play(); } catch (err) {}
}
/* sparse board: fewer safe than unsafe, no continuous spawn spam */
var i;
/* safe first + force first safe */
for (i = 0; i < Math.max(1, cfg.startSafe); i++) placePic(true, i === 0);
for (i = 0; i < cfg.startBad; i++) placePic(false, false);
ensureOneSafe();
tickTimer = setInterval(function () {
timeLeft -= 0.1;
if (timeLeft <= 0) {
if (timeEl) timeEl.textContent = "0.0";
finish();
return;
}
if (timeEl) timeEl.textContent = timeLeft.toFixed(1);
}, 100);
}
function cleanup() {
running = false;
clearInterval(tickTimer);
document.documentElement.classList.remove("ft-trial-fs");
try {
if (window.FT_uiBar) FT_uiBar.restore(); else if (typeof UIBar !== "undefined" && UIBar.unstow) UIBar.unstow();
} catch (e) {}
}
if (startBtn) startBtn.onclick = startGame;
if (muteBtn) {
muteBtn.onclick = function () {
soundOn = !soundOn;
if (video) {
video.muted = !soundOn;
if (soundOn) {
try { video.play(); } catch (e) {}
}
}
muteBtn.textContent = soundOn ? "🔊 Mute" : "🔇 Unmute";
muteBtn.classList.toggle("is-on", soundOn);
};
}
if (pleasureBtn) {
pleasureBtn.onclick = function () {
/* placeholder */
};
}
var again = document.getElementById("ft-trial-again");
var menu = document.getElementById("ft-trial-menu");
var exit = document.getElementById("ft-trial-exit");
if (again) again.onclick = function () { cleanup(); Engine.play("Focus Trial Play"); };
if (menu) menu.onclick = function () { cleanup(); Engine.play("Focus Trial"); };
if (exit) exit.onclick = function () { cleanup(); Engine.play("Debug Menu"); };
$(document).one(":passageend", cleanup);
}
$(document).one(":passagedisplay", boot);
setTimeout(boot, 0);
setTimeout(boot, 50);
})();
<</script>><div class="passage-title">Stamina Trial (prototype)</div>
<div class="panel">
<div class="panel-title">Does not affect the real game</div>
Fullscreen video on. Play <b>one mode at a time</b>. Tell me which to keep for the real Stamina game.
</div>
<<silently>>
<<if ndef $stTrialDiff>><<set $stTrialDiff to 1>><</if>>
<<if ndef $stTrialVideo or !$stTrialVideo>><<set $stTrialVideo to "career/story/t4.webm">><</if>>
<</silently>>
<div class="panel">
<div class="panel-title">1 · Hold-the-line <span class="hint">(kept)</span></div>
<span class="hint">Keep the marker inside the shrinking green zone (← → / A D).</span>
<div class="nav-grid">
<<link "▶ Hold Diff 1">><<set $stTrialMode to "hold">><<set $stTrialDiff to 1>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Hold Diff 2">><<set $stTrialMode to "hold">><<set $stTrialDiff to 2>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Hold Diff 3">><<set $stTrialMode to "hold">><<set $stTrialDiff to 3>><<goto "Stamina Trial Play">><</link>>
</div>
</div>
<div class="panel">
<div class="panel-title">2 · Brace phases</div>
<span class="hint">Quiet hold → sudden burst of taps → quiet again. Pace yourself; don’t panic in the burst.</span>
<div class="nav-grid">
<<link "▶ Brace Diff 1">><<set $stTrialMode to "brace">><<set $stTrialDiff to 1>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Brace Diff 2">><<set $stTrialMode to "brace">><<set $stTrialDiff to 2>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Brace Diff 3">><<set $stTrialMode to "brace">><<set $stTrialDiff to 3>><<goto "Stamina Trial Play">><</link>>
</div>
</div>
<div class="panel">
<div class="panel-title">3 · Dual resource</div>
<span class="hint">Space builds <b>Power</b>. Shift / Right-click builds <b>Cooling</b>. Overheat (Power high + Cooling low) fails.</span>
<div class="nav-grid">
<<link "▶ Dual Diff 1">><<set $stTrialMode to "dual">><<set $stTrialDiff to 1>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Dual Diff 2">><<set $stTrialMode to "dual">><<set $stTrialDiff to 2>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Dual Diff 3">><<set $stTrialMode to "dual">><<set $stTrialDiff to 3>><<goto "Stamina Trial Play">><</link>>
</div>
</div>
<div class="panel">
<div class="panel-title">4 · Rope tug</div>
<span class="hint">Alternate A / D (or ← →) to keep rope tension in the safe band. Same key twice slips the rope.</span>
<div class="nav-grid">
<<link "▶ Rope Diff 1">><<set $stTrialMode to "rope">><<set $stTrialDiff to 1>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Rope Diff 2">><<set $stTrialMode to "rope">><<set $stTrialDiff to 2>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Rope Diff 3">><<set $stTrialMode to "rope">><<set $stTrialDiff to 3>><<goto "Stamina Trial Play">><</link>>
</div>
</div>
<div class="panel">
<div class="panel-title">5 · Breath cycle <span class="hint">(feature lab)</span></div>
<span class="hint">Hold Space = inhale. Release = exhale. Stay in the green window. Tick features → Save → Play.</span>
<<silently>>
<<if ndef $breathFeat>><<set $breathFeat to {
"movingWindow": true,
"inhaleExhalePhases": true,
"pressureDrift": true,
"perfectBand": true,
"holdFatigue": false,
"secondWind": true,
"visualLungs": true,
"metronomePulse": false,
"penaltySpike": true
}>><</if>>
<</silently>>
<form id="breath-feat-form" style="margin-top:10px;line-height:1.85;">
<label><input type="checkbox" data-feat="movingWindow" checked> <b>Moving window</b> — green band drifts</label><br>
<label><input type="checkbox" data-feat="inhaleExhalePhases" checked> <b>Inhale / exhale phases</b> — target high on inhale cue, low on exhale</label><br>
<label><input type="checkbox" data-feat="pressureDrift" checked> <b>Pressure drift</b> — slight leak while holding</label><br>
<label><input type="checkbox" data-feat="perfectBand" checked> <b>Perfect band</b> — inner zone bonus score</label><br>
<label><input type="checkbox" data-feat="holdFatigue"> <b>Hold fatigue</b> — long holds shrink the window</label><br>
<label><input type="checkbox" data-feat="secondWind" checked> <b>Second wind</b> — one auto-rescue if you slip out</label><br>
<label><input type="checkbox" data-feat="visualLungs" checked> <b>Visual lungs</b> — lung fill meter</label><br>
<label><input type="checkbox" data-feat="metronomePulse"> <b>Metronome pulse</b> — INHALE / EXHALE cue text</label><br>
<label><input type="checkbox" data-feat="penaltySpike" checked> <b>Penalty spike</b> — stress meter when off-band (fail at max)</label>
</form>
<button type="button" id="breath-feat-save" style="margin-top:10px;padding:8px 16px;border-radius:8px;border:1px solid #ba55d3;background:rgba(186,85,211,0.35);color:#fff;cursor:pointer;font-weight:600;">Save breath features</button>
<span id="breath-feat-saved" style="margin-left:8px;color:#69f0ae;display:none;">Saved.</span>
<div class="nav-grid" style="margin-top:12px;">
<<link "▶ Breath Diff 1">><<set $stTrialMode to "breath">><<set $stTrialDiff to 1>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Breath Diff 2">><<set $stTrialMode to "breath">><<set $stTrialDiff to 2>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Breath Diff 3">><<set $stTrialMode to "breath">><<set $stTrialDiff to 3>><<goto "Stamina Trial Play">><</link>>
</div>
</div>
<<script>>
$(document).one(':passagedisplay', function () {
var feat = State.variables.breathFeat || {};
document.querySelectorAll('#breath-feat-form input[data-feat]').forEach(function (el) {
var k = el.getAttribute('data-feat');
if (Object.prototype.hasOwnProperty.call(feat, k)) el.checked = !!feat[k];
});
var btn = document.getElementById('breath-feat-save');
if (btn) btn.onclick = function () {
var next = {};
document.querySelectorAll('#breath-feat-form input[data-feat]').forEach(function (el) {
next[el.getAttribute('data-feat')] = !!el.checked;
});
State.variables.breathFeat = next;
var s = document.getElementById('breath-feat-saved');
if (s) { s.style.display = 'inline'; setTimeout(function(){ s.style.display='none'; }, 1200); }
};
});
<</script>>
<div class="panel">
<div class="panel-title">6 · Rebound</div>
<span class="hint">A pulse rises and falls. Click / Space at the <b>apex</b> (top). Early/late hurts your streak.</span>
<div class="nav-grid">
<<link "▶ Rebound Diff 1">><<set $stTrialMode to "rebound">><<set $stTrialDiff to 1>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Rebound Diff 2">><<set $stTrialMode to "rebound">><<set $stTrialDiff to 2>><<goto "Stamina Trial Play">><</link>>
<<link "▶ Rebound Diff 3">><<set $stTrialMode to "rebound">><<set $stTrialDiff to 3>><<goto "Stamina Trial Play">><</link>>
</div>
</div>
<div class="panel">
<div class="panel-title">Video</div>
<code><<print $stTrialVideo>></code>
<div class="nav-grid">
<<link "t4.webm">><<set $stTrialVideo to "career/story/t4.webm">><<goto "Stamina Trial">><</link>>
<<link "sn15.webm">><<set $stTrialVideo to "career/story/sn15.webm">><<goto "Stamina Trial">><</link>>
</div>
</div>
<div class="nav-grid">
[[Focus Trial|Focus Trial]]
[[Technique Trial|Technique Trial]]
[[Debug Menu|Debug Menu]]
</div><<silently>>
<<if ndef $stTrialMode>><<set $stTrialMode to "hold">><</if>>
<<if ndef $stTrialDiff>><<set $stTrialDiff to 1>><</if>>
<<if ndef $stTrialVideo or !$stTrialVideo>><<set $stTrialVideo to "career/story/t4.webm">><</if>>
<</silently>>
<style>
html.ft-st-trial #ui-bar, html.ft-st-trial #ui-bar-body, html.ft-st-trial #ui-bar-toggle { display: none !important; }
html.ft-st-trial #story { margin: 0 !important; width: 100% !important; max-width: 100% !important; }
html.ft-st-trial #passages, html.ft-st-trial .passage { margin: 0 !important; padding: 0 !important; max-width: none !important; width: 100% !important; }
#st-stage { position: fixed; inset: 0; z-index: 99980; width: 100vw; height: 100vh; background: #000; overflow: hidden; }
#st-video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; background: #000; }
#st-top {
position: absolute; top: 12px; left: 12px; right: 12px; z-index: 6;
display: flex; justify-content: space-between; gap: 10px; pointer-events: none;
}
#st-top .chip {
background: rgba(0,0,0,0.62); color: #fff; padding: 8px 12px; border-radius: 12px;
font-weight: 700; font-size: 0.92rem; border: 1px solid rgba(186,85,211,0.35); text-shadow: 0 1px 4px #000;
}
#st-field {
position: absolute; left: 0; right: 0; bottom: 0; height: 44%;
z-index: 4; background: linear-gradient(to top, rgba(0,0,0,0.58), rgba(0,0,0,0.05));
display: flex; flex-direction: column; align-items: center; justify-content: center;
padding: 10px 16px 56px; box-sizing: border-box;
}
#st-hint { color: #f3e5f5; font-weight: 600; text-shadow: 0 2px 8px #000; margin-bottom: 8px; font-size: 0.92rem; text-align: center; max-width: 520px; }
#st-phase {
display: none; font-size: 1.35rem; font-weight: 800; color: #e1bee7; text-shadow: 0 2px 10px #000;
margin-bottom: 6px; letter-spacing: 0.04em;
}
.st-meter-row { width: min(520px, 92vw); display: none; align-items: center; gap: 10px; margin: 5px 0; }
.st-meter-row.on { display: flex; }
.st-meter-row .lab { width: 78px; color: #fff; font-size: 0.78rem; font-weight: 700; text-shadow: 0 1px 3px #000; }
.st-track { flex: 1; height: 16px; border-radius: 99px; background: rgba(255,255,255,0.12); overflow: hidden; position: relative; }
.st-fill { height: 100%; width: 0%; border-radius: 99px; }
#st-fill-a { background: linear-gradient(90deg, #6a1b9a, #ce93d8); }
#st-fill-b { background: linear-gradient(90deg, #1565c0, #82b1ff); }
#st-fill-c { background: linear-gradient(90deg, #c62828, #ff8a80); }
#st-zone-wrap {
display: none; width: min(520px, 92vw); height: 48px; position: relative;
background: rgba(0,0,0,0.35); border-radius: 12px; border: 1px solid rgba(255,255,255,0.12); margin: 8px 0;
}
#st-zone {
position: absolute; top: 6px; bottom: 6px; border-radius: 8px;
background: rgba(105,240,174,0.35); border: 2px solid rgba(105,240,174,0.85);
}
#st-marker {
position: absolute; top: 4px; bottom: 4px; width: 10px; margin-left: -5px;
background: #fff; border-radius: 4px; box-shadow: 0 0 12px rgba(186,85,211,0.9);
}
#st-rebound {
display: none; width: min(420px, 90vw); height: 140px; position: relative;
border: 1px solid rgba(255,255,255,0.12); border-radius: 12px; background: rgba(0,0,0,0.3);
}
#st-rebound-ball {
position: absolute; left: 50%; width: 28px; height: 28px; margin-left: -14px;
border-radius: 50%; background: radial-gradient(circle at 30% 30%, #f3e5f5, #ba68c8);
box-shadow: 0 0 16px rgba(186,85,211,0.8); bottom: 8px;
}
#st-rebound-apex {
position: absolute; left: 10%; right: 10%; height: 2px; top: 18px;
background: rgba(105,240,174,0.7); box-shadow: 0 0 8px rgba(105,240,174,0.5);
}
#st-bottom {
position: absolute; left: 0; right: 0; bottom: 12px; z-index: 7;
display: flex; justify-content: center; gap: 10px; pointer-events: none;
}
#st-bottom button {
pointer-events: auto; padding: 10px 16px; border-radius: 999px;
border: 1px solid rgba(186,85,211,0.5); background: rgba(20,12,28,0.78);
color: #f3e5f5; font-weight: 700; cursor: pointer; font-size: 0.9rem;
}
#st-bottom button.is-on { border-color: rgba(105,240,174,0.55); color: #b9f6ca; }
#st-start, #st-end {
position: absolute; inset: 0; z-index: 10;
display: flex; flex-direction: column; align-items: center; justify-content: center;
gap: 12px; background: rgba(8,4,14,0.55); color: #f3e5f5; text-align: center; padding: 24px;
}
#st-end { display: none; background: rgba(8,4,14,0.72); }
#st-start h3, #st-end h3 { margin: 0; color: #e1bee7; font-size: 1.5rem; text-shadow: 0 2px 10px #000; }
#st-start p { margin: 0; max-width: 480px; line-height: 1.45; text-shadow: 0 1px 6px #000; }
#st-start-btn, #st-end-nav button {
padding: 14px 32px; font-size: 1.1rem; font-weight: 700; border-radius: 999px;
border: 1px solid #ba55d3; background: rgba(186,85,211,0.6); color: #fff; cursor: pointer;
}
#st-end-nav { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; }
#st-end-nav button { font-size: 0.95rem; padding: 10px 18px; background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.3); }
#st-score-big { font-size: 2.4rem; font-weight: 800; color: #e1bee7; }
</style>
<div id="st-stage">
<video id="st-video" autoplay loop muted playsinline>
<source @src="$stTrialVideo" type="video/webm">
</video>
<div id="st-top">
<div class="chip"><span id="st-mode-label">Mode</span> · Diff <<print $stTrialDiff>></div>
<div class="chip">⏱ <b id="st-clock">15.0</b>s · <b id="st-live">—</b></div>
</div>
<div id="st-field">
<div id="st-phase"></div>
<div id="st-hint">—</div>
<div id="st-zone-wrap"><div id="st-zone"></div><div id="st-marker"></div></div>
<div class="st-meter-row" id="st-row-a"><span class="lab" id="st-lab-a">A</span><div class="st-track"><div class="st-fill" id="st-fill-a"></div></div></div>
<div class="st-meter-row" id="st-row-b"><span class="lab" id="st-lab-b">B</span><div class="st-track"><div class="st-fill" id="st-fill-b"></div></div></div>
<div class="st-meter-row" id="st-row-c"><span class="lab" id="st-lab-c">Heat</span><div class="st-track"><div class="st-fill" id="st-fill-c"></div></div></div>
<div id="st-rebound"><div id="st-rebound-apex"></div><div id="st-rebound-ball"></div></div>
</div>
<div id="st-bottom">
<button type="button" id="st-mute-btn">🔇 Unmute</button>
<button type="button" id="st-score-btn">Score: —</button>
</div>
<div id="st-start">
<h3 id="st-start-title">Stamina Trial</h3>
<p id="st-start-desc">Get ready.</p>
<button type="button" id="st-start-btn">▶ Start</button>
</div>
<div id="st-end">
<h3>Result</h3>
<div id="st-score-big">0%</div>
<div id="st-summary"></div>
<div id="st-end-nav">
<button type="button" id="st-again">Again</button>
<button type="button" id="st-menu">Trial menu</button>
<button type="button" id="st-exit">Exit</button>
</div>
</div>
</div>
<<script>>
(function () {
function boot() {
var stage = document.getElementById('st-stage');
if (!stage || stage.dataset.booted) return;
stage.dataset.booted = '1';
try { if (window.FT_uiBar) FT_uiBar.remember(); } catch (e) {}
document.documentElement.classList.add('ft-st-trial');
try { if (typeof UIBar !== 'undefined' && UIBar.stow) UIBar.stow(true); } catch (e) {}
var mode = State.variables.stTrialMode || 'hold';
var diff = Number(State.variables.stTrialDiff) || 1;
var breathFeat = Object.assign({
movingWindow: true, inhaleExhalePhases: true, pressureDrift: true, perfectBand: true,
holdFatigue: false, secondWind: true, visualLungs: true, metronomePulse: false, penaltySpike: true
}, State.variables.breathFeat || {});
var duration = diff === 1 ? 16 : diff === 2 ? 15 : 13;
var video = document.getElementById('st-video');
if (video) {
var vpath = State.variables.stTrialVideo || 'career/story/t4.webm';
var srcEl = video.querySelector('source');
if (srcEl) { srcEl.setAttribute('src', vpath); video.load(); }
try { video.muted = true; video.play(); } catch (e) {}
}
var titles = {
hold: 'Hold-the-line', brace: 'Brace phases', dual: 'Dual resource',
rope: 'Rope tug', breath: 'Breath cycle', rebound: 'Rebound'
};
var descs = {
hold: '← → or A / D — keep the white marker in the green zone as it shrinks.',
brace: 'HOLD phases: stay still or light taps. BURST phases: mash Space. Wrong pace hurts.',
dual: 'Space = Power. Shift = Cooling. Keep Heat from maxing (Power rising while Cooling is low).',
rope: 'Alternate A and D (or ← →). Same side twice slips tension out of the band.',
breath: 'Hold Space to inhale, release to exhale. Match the moving green breath window.',
rebound: 'Click / Space when the ball hits the apex line at the top of its bounce.'
};
document.getElementById('st-mode-label').textContent = titles[mode] || mode;
document.getElementById('st-start-title').textContent = titles[mode] || 'Stamina';
document.getElementById('st-start-desc').textContent = descs[mode] || '';
document.getElementById('st-hint').textContent = descs[mode] || '';
var zoneWrap = document.getElementById('st-zone-wrap');
var rowA = document.getElementById('st-row-a');
var rowB = document.getElementById('st-row-b');
var rowC = document.getElementById('st-row-c');
var phaseEl = document.getElementById('st-phase');
var rebound = document.getElementById('st-rebound');
var ball = document.getElementById('st-rebound-ball');
zoneWrap.style.display = (mode === 'hold' || mode === 'rope' || mode === 'breath') ? 'block' : 'none';
rowA.className = 'st-meter-row' + (mode === 'dual' || mode === 'brace' ? ' on' : '');
rowB.className = 'st-meter-row' + (mode === 'dual' ? ' on' : '');
rowC.className = 'st-meter-row' + (mode === 'dual' ? ' on' : '');
phaseEl.style.display = mode === 'brace' ? 'block' : 'none';
rebound.style.display = mode === 'rebound' ? 'block' : 'none';
document.getElementById('st-lab-a').textContent = mode === 'dual' ? 'Power' : mode === 'brace' ? 'Stability' : 'A';
document.getElementById('st-lab-b').textContent = 'Cooling';
document.getElementById('st-lab-c').textContent = 'Heat';
var running = false, finished = false, soundOn = false;
var tLeft = duration, score = 0, good = 0, bad = 0;
var tickTimer = null, raf = null;
var clockEl = document.getElementById('st-clock');
var liveEl = document.getElementById('st-live');
var scoreBtn = document.getElementById('st-score-btn');
var fillA = document.getElementById('st-fill-a');
var fillB = document.getElementById('st-fill-b');
var fillC = document.getElementById('st-fill-c');
var zoneEl = document.getElementById('st-zone');
var markerEl = document.getElementById('st-marker');
// hold / rope / breath shared band UI
var marker = 50, zoneC = 50, zoneW = 30, drift = 0;
var keys = { left: false, right: false, space: false, shift: false };
var lastRope = 0; // -1 left 1 right
var tension = 50;
// brace
var phase = 'hold'; // hold | burst
var phaseT = 0;
var stability = 80;
var burstNeed = 0, burstGot = 0;
// dual
var power = 30, cooling = 70, heat = 0;
// breath
var lung = 40;
var breathTarget = 50, breathWin = 28, breathWinBase = 28;
var breathStress = 0, offBreathMs = 0, secondWindUsed = false, breathHoldMs = 0;
// rebound
var bounceT = 0;
var bouncePeriod = diff === 1 ? 1.1 : diff === 2 ? 0.9 : 0.75;
var canHit = true;
function uiScore(s) {
score = Math.max(0, Math.min(100, Math.round(s)));
if (scoreBtn) scoreBtn.textContent = 'Score: ' + score + '%';
if (liveEl) liveEl.textContent = score + '%';
}
function setZone(c, w) {
zoneC = c; zoneW = w;
zoneEl.style.left = (c - w / 2) + '%';
zoneEl.style.width = w + '%';
}
function setMarker(m) {
marker = Math.max(0, Math.min(100, m));
markerEl.style.left = marker + '%';
}
function endRun(msg) {
if (finished) return;
finished = true; running = false;
clearInterval(tickTimer);
if (raf) cancelAnimationFrame(raf);
window.removeEventListener('keydown', onKeyDown);
window.removeEventListener('keyup', onKeyUp);
State.variables.stTrialLastScore = score;
State.variables.stTrialLastMode = mode;
if (State.variables.mg_ProductionLaunch) {
State.variables.mg_ProductionLaunch = false;
if (typeof cleanup === "function") cleanup();
if (typeof FT_finishMinigame === "function") {
setTimeout(function () { FT_finishMinigame(score); }, 400);
}
return;
}
document.getElementById('st-score-big').textContent = score + '%';
document.getElementById('st-summary').textContent = (msg || '') + ' · ' + (titles[mode] || mode) + ' · Diff ' + diff;
document.getElementById('st-end').style.display = 'flex';
}
function onKeyDown(e) {
if (!running || finished) return;
if (e.key === 'ArrowLeft' || e.key === 'a' || e.key === 'A') keys.left = true;
if (e.key === 'ArrowRight' || e.key === 'd' || e.key === 'D') keys.right = true;
if (e.key === 'Shift') keys.shift = true;
if (e.key === ' ' || e.code === 'Space') {
e.preventDefault();
if (!keys.space) {
keys.space = true;
onSpaceDown();
}
}
}
function onKeyUp(e) {
if (e.key === 'ArrowLeft' || e.key === 'a' || e.key === 'A') keys.left = false;
if (e.key === 'ArrowRight' || e.key === 'd' || e.key === 'D') keys.right = false;
if (e.key === 'Shift') keys.shift = false;
if (e.key === ' ' || e.code === 'Space') {
keys.space = false;
onSpaceUp();
}
}
function onSpaceDown() {
if (mode === 'brace') {
if (phase === 'burst') {
burstGot++;
stability = Math.min(100, stability + 2);
} else {
// tapping in hold phase is slightly bad
stability = Math.max(0, stability - (diff === 1 ? 3 : 5));
bad++;
}
fillA.style.width = stability + '%';
uiScore(stability);
} else if (mode === 'dual') {
power = Math.min(100, power + (diff === 1 ? 5 : 4));
fillA.style.width = power + '%';
} else if (mode === 'rebound') {
hitRebound();
} else if (mode === 'rope') {
// space unused
}
}
function onSpaceUp() { /* breath uses continuous hold via keys.space in frame */ }
function hitRebound() {
// ball bottom% driven by sin; apex when sin ~ 1
var ang = (bounceT / bouncePeriod) * Math.PI; // 0..pi up and down one bounce half? use full
var y = Math.abs(Math.sin((bounceT / bouncePeriod) * Math.PI)); // 0 bottom 1 top
var err = Math.abs(y - 1);
var win = diff === 1 ? 0.14 : diff === 2 ? 0.10 : 0.07;
if (!canHit) return;
if (err <= win) {
good++;
canHit = false;
uiScore(Math.min(100, good * 12 - bad * 10));
} else {
bad++;
uiScore(Math.min(100, good * 12 - bad * 10));
}
}
function frame(ts) {
if (!running || finished) return;
if (mode === 'hold') {
drift += (Math.random() - 0.5) * (0.16 + diff * 0.07);
drift *= 0.98;
if (keys.left) marker -= 0.55;
if (keys.right) marker += 0.55;
marker += drift;
setMarker(marker);
zoneW = Math.max(diff === 1 ? 16 : 12, zoneW - 0.012 * diff);
zoneC += (Math.random() - 0.5) * 0.08;
zoneC = Math.max(zoneW / 2 + 2, Math.min(100 - zoneW / 2 - 2, zoneC));
setZone(zoneC, zoneW);
var inside = marker >= zoneC - zoneW / 2 && marker <= zoneC + zoneW / 2;
if (inside) good++; else bad++;
uiScore((good / Math.max(1, good + bad)) * 100);
} else if (mode === 'rope') {
// tension drifts toward 0 without alternating input
tension += (Math.random() - 0.5) * 0.2;
tension -= 0.04 * diff; // slow slip
if (keys.left) {
if (lastRope === -1) tension -= (diff === 1 ? 1.2 : 1.8);
else { tension += (diff === 1 ? 2.2 : 1.8); lastRope = -1; }
keys.left = false; // treat as tap pulses via edge — actually hold spam: use press edge only
}
// better: apply continuous small from held keys but alternate bonus checked on keydown
setMarker(tension);
setZone(50, diff === 1 ? 36 : diff === 2 ? 28 : 20);
var inB = tension >= 50 - (diff === 1 ? 18 : diff === 2 ? 14 : 10) && tension <= 50 + (diff === 1 ? 18 : 14);
if (inB) good++; else bad++;
tension = Math.max(0, Math.min(100, tension));
uiScore((good / Math.max(1, good + bad)) * 100);
if (tension <= 0 || tension >= 100) endRun('Rope slipped.');
} else if (mode === 'breath') {
var now = performance.now();
var cycle = 2200 - diff * 200; // full inhale+exhale ms
var phase01 = (now / cycle) % 1; // 0..1
var inhalingCue = phase01 < 0.5;
// lung control
var up = diff === 1 ? 0.38 : diff === 2 ? 0.42 : 0.46;
var down = diff === 1 ? 0.32 : diff === 2 ? 0.36 : 0.40;
if (keys.space) {
lung = Math.min(100, lung + up);
if (breathFeat.pressureDrift) lung = Math.max(0, lung - 0.06); // leak while holding
if (breathFeat.holdFatigue) {
breathHoldMs = (breathHoldMs || 0) + 1000/60;
if (breathHoldMs > 900) breathWin = Math.max(12, breathWin - 0.02 * diff);
}
} else {
lung = Math.max(0, lung - down);
breathHoldMs = 0;
}
// window
breathWin = breathWinBase;
if (breathFeat.movingWindow) {
var amp = diff === 1 ? 16 : diff === 2 ? 22 : 28;
breathTarget = 50 + Math.sin(now / (1100 - diff * 120)) * amp;
} else {
breathTarget = 50;
}
if (breathFeat.inhaleExhalePhases) {
// bias target high during inhale cue, low during exhale cue
breathTarget += inhalingCue ? (diff === 1 ? 8 : 11) : (diff === 1 ? -8 : -11);
breathTarget = Math.max(18, Math.min(82, breathTarget));
}
if (breathFeat.metronomePulse && phaseEl) {
phaseEl.style.display = 'block';
phaseEl.textContent = inhalingCue ? 'INHALE' : 'EXHALE';
phaseEl.style.color = inhalingCue ? '#82b1ff' : '#ce93d8';
}
setMarker(lung);
setZone(breathTarget, breathWin);
var half = breathWin / 2;
var dist = Math.abs(lung - breathTarget);
var ok = dist <= half;
var perfect = breathFeat.perfectBand && dist <= half * 0.4;
if (ok) {
good++;
if (perfect) good++;
secondWindUsed = secondWindUsed; // no-op keep ref
offBreathMs = 0;
} else {
bad++;
offBreathMs = (offBreathMs || 0) + 1000/60;
if (breathFeat.penaltySpike) {
breathStress = Math.min(100, (breathStress || 0) + 0.35 * diff);
if (rowC) { rowC.className = 'st-meter-row on'; fillC.style.width = breathStress + '%'; }
if (breathStress >= 100) { endRun('Breath stress maxed.'); return; }
}
if (breathFeat.secondWind && !secondWindUsed && offBreathMs > 350) {
lung = breathTarget;
secondWindUsed = true;
offBreathMs = 0;
setMarker(lung);
}
}
// visual lungs — reuse fill A as lung volume
if (breathFeat.visualLungs) {
rowA.className = 'st-meter-row on';
document.getElementById('st-lab-a').textContent = 'Lungs';
fillA.style.width = lung + '%';
}
var acc = good / Math.max(1, good + bad);
uiScore(acc * 85 + (perfect ? 5 : 0) + (secondWindUsed ? 0 : 5));
} else if (mode === 'brace') {
phaseT += 1 / 60;
var holdLen = diff === 1 ? 3.2 : 2.6;
var burstLen = diff === 1 ? 2.0 : 2.4;
if (phase === 'hold' && phaseT > holdLen) {
phase = 'burst'; phaseT = 0; burstGot = 0;
burstNeed = diff === 1 ? 8 : diff === 2 ? 11 : 14;
phaseEl.textContent = 'BURST — mash Space';
phaseEl.style.color = '#ff8a80';
} else if (phase === 'burst' && phaseT > burstLen) {
if (burstGot < burstNeed * 0.5) stability = Math.max(0, stability - 15);
phase = 'hold'; phaseT = 0;
phaseEl.textContent = 'HOLD — ease up';
phaseEl.style.color = '#82b1ff';
}
// passive stability
if (phase === 'hold') stability = Math.min(100, stability + 0.05);
fillA.style.width = stability + '%';
uiScore(stability);
if (stability <= 0) endRun('Lost stability.');
} else if (mode === 'dual') {
if (keys.space) power = Math.min(100, power + 0.25);
if (keys.shift) cooling = Math.min(100, cooling + 0.3);
// natural drain
power = Math.max(0, power - 0.02);
cooling = Math.max(0, cooling - 0.06 * diff);
// heat rises when power high and cooling low
var risk = Math.max(0, (power - 50) * 0.02 + (50 - cooling) * 0.03);
heat = Math.min(100, Math.max(0, heat + risk - 0.04));
fillA.style.width = power + '%';
fillB.style.width = cooling + '%';
fillC.style.width = heat + '%';
uiScore(Math.max(0, power * 0.5 + cooling * 0.3 - heat * 0.4));
if (heat >= 100) endRun('Overheat.');
} else if (mode === 'rebound') {
bounceT += 1 / 60;
var y = Math.abs(Math.sin((bounceT / bouncePeriod) * Math.PI)); // 0..1
ball.style.bottom = (8 + y * 100) + 'px';
// re-arm hit after leaving apex
if (y < 0.6) canHit = true;
}
raf = requestAnimationFrame(frame);
}
// rope: proper alternate on keydown edges
var ropeSide = 0;
var _origKeyDown = onKeyDown;
onKeyDown = function (e) {
if (!running || finished) return;
if (mode === 'rope' && (e.key === 'ArrowLeft' || e.key === 'a' || e.key === 'A' || e.key === 'ArrowRight' || e.key === 'd' || e.key === 'D')) {
e.preventDefault();
var side = (e.key === 'ArrowLeft' || e.key === 'a' || e.key === 'A') ? -1 : 1;
if (side === ropeSide) {
tension -= (diff === 1 ? 4 : 6);
bad++;
} else {
tension += (diff === 1 ? 5 : 4);
good++;
ropeSide = side;
}
tension = Math.max(0, Math.min(100, tension));
setMarker(tension);
return;
}
_origKeyDown(e);
};
document.getElementById('st-field').addEventListener('click', function () {
if (!running || finished) return;
if (mode === 'rebound') hitRebound();
if (mode === 'brace' && phase === 'burst') {
burstGot++;
stability = Math.min(100, stability + 2);
fillA.style.width = stability + '%';
uiScore(stability);
}
if (mode === 'dual') {
power = Math.min(100, power + 4);
fillA.style.width = power + '%';
}
});
document.getElementById('st-field').addEventListener('contextmenu', function (e) {
if (mode === 'dual' && running) {
e.preventDefault();
cooling = Math.min(100, cooling + 6);
fillB.style.width = cooling + '%';
}
});
function startGame() {
document.getElementById('st-start').style.display = 'none';
document.getElementById('st-end').style.display = 'none';
running = true; finished = false;
tLeft = duration; good = bad = 0;
marker = 50; zoneC = 50; drift = 0; tension = 50; ropeSide = 0;
zoneW = diff === 1 ? 34 : diff === 2 ? 26 : 18;
stability = 80; phase = 'hold'; phaseT = 0;
power = 35; cooling = 65; heat = 10;
lung = 45; bounceT = 0; canHit = true;
breathWinBase = diff === 1 ? 32 : diff === 2 ? 26 : 20;
breathWin = breathWinBase;
breathStress = 0; offBreathMs = 0; secondWindUsed = false; breathHoldMs = 0;
if (mode === 'breath' && breathFeat.penaltySpike) {
rowC.className = 'st-meter-row on';
document.getElementById('st-lab-c').textContent = 'Stress';
fillC.style.width = '0%';
}
if (mode === 'breath' && breathFeat.metronomePulse) phaseEl.style.display = 'block';
if (mode === 'brace') {
phaseEl.style.display = 'block';
phaseEl.textContent = 'HOLD — ease up';
phaseEl.style.color = '#82b1ff';
fillA.style.width = stability + '%';
}
if (mode === 'hold' || mode === 'rope') setZone(50, zoneW);
if (mode === 'rope') setZone(50, diff === 1 ? 36 : diff === 2 ? 28 : 20);
if (mode === 'breath') setZone(50, 28);
setMarker(mode === 'rope' ? tension : mode === 'breath' ? lung : 50);
if (mode === 'dual') {
fillA.style.width = power + '%';
fillB.style.width = cooling + '%';
fillC.style.width = heat + '%';
}
if (clockEl) clockEl.textContent = tLeft.toFixed(1);
uiScore(mode === 'brace' ? stability : mode === 'dual' ? 50 : 0);
if (video) try { video.play(); } catch (e) {}
window.addEventListener('keydown', onKeyDown);
window.addEventListener('keyup', onKeyUp);
raf = requestAnimationFrame(frame);
tickTimer = setInterval(function () {
if (!running || finished) return;
tLeft -= 0.1;
if (clockEl) clockEl.textContent = Math.max(0, tLeft).toFixed(1);
if (tLeft <= 0) {
if (mode === 'hold' || mode === 'rope' || mode === 'breath') {
uiScore((good / Math.max(1, good + bad)) * 100);
endRun('Time up.');
} else if (mode === 'brace') {
uiScore(stability);
endRun('Time up.');
} else if (mode === 'dual') {
uiScore(Math.max(0, power * 0.5 + cooling * 0.3 - heat * 0.4));
endRun('Time up.');
} else if (mode === 'rebound') {
uiScore(Math.min(100, Math.max(0, good * 12 - bad * 10)));
endRun('Time up.');
}
}
}, 100);
}
function cleanup() {
finished = true; running = false;
clearInterval(tickTimer);
if (raf) cancelAnimationFrame(raf);
window.removeEventListener('keydown', onKeyDown);
window.removeEventListener('keyup', onKeyUp);
document.documentElement.classList.remove('ft-st-trial');
try { if (window.FT_uiBar) FT_uiBar.restore(); else if (typeof UIBar !== 'undefined' && UIBar.unstow) UIBar.unstow(); } catch (e) {}
}
document.getElementById('st-start-btn').onclick = startGame;
document.getElementById('st-mute-btn').onclick = function () {
soundOn = !soundOn;
if (video) { video.muted = !soundOn; if (soundOn) try { video.play(); } catch (e) {} }
this.textContent = soundOn ? '🔊 Mute' : '🔇 Unmute';
this.classList.toggle('is-on', soundOn);
};
document.getElementById('st-again').onclick = function () { cleanup(); Engine.play('Stamina Trial Play'); };
document.getElementById('st-menu').onclick = function () { cleanup(); Engine.play('Stamina Trial'); };
document.getElementById('st-exit').onclick = function () { cleanup(); Engine.play('Debug Menu'); };
$(document).one(':passageend', cleanup);
}
$(document).one(':passagedisplay', boot);
setTimeout(boot, 0);
setTimeout(boot, 50);
})();
<</script>><div class="passage-title">Technique Trial — One-path</div>
<div class="panel">
<div class="panel-title">Does not affect the real game</div>
Fullscreen video on. Trace from <b>START</b> to <b>FINISH</b> without leaving the path.
Timer starts when you leave START. Run ends when you reach FINISH (or leave the path too long / time out).
</div>
<<silently>>
<<if ndef $techTrialDiff>><<set $techTrialDiff to 1>><</if>>
<<if ndef $techTrialVideo or !$techTrialVideo>><<set $techTrialVideo to "career/story/t4.webm">><</if>>
<<set $techTrialMode to "path">>
<</silently>>
<div class="panel">
<div class="panel-title">Play</div>
<div class="nav-grid">
<<link "▶ Diff 1 — zigzags + vertical runs">><<set $techTrialDiff to 1>><<goto "Technique Trial Play">><</link>>
<<link "▶ Diff 2 — tighter zigzags + detour">><<set $techTrialDiff to 2>><<goto "Technique Trial Play">><</link>>
<<link "▶ Diff 3 — dense zigzags + extra kinks">><<set $techTrialDiff to 3>><<goto "Technique Trial Play">><</link>>
</div>
Last diff: <b><<print $techTrialDiff>></b>
</div>
<div class="panel">
<div class="panel-title">Background video</div>
<code><<print $techTrialVideo>></code>
<div class="nav-grid">
<<link "t4.webm">><<set $techTrialVideo to "career/story/t4.webm">><<goto "Technique Trial">><</link>>
<<link "sn15.webm">><<set $techTrialVideo to "career/story/sn15.webm">><<goto "Technique Trial">><</link>>
</div>
</div>
<div class="nav-grid">
[[Focus Trial|Focus Trial]]
[[Stamina Trial|Stamina Trial]]
[[Debug Menu|Debug Menu]]
</div><<silently>>
<<set $techTrialMode to "path">>
<<if ndef $techTrialDiff>><<set $techTrialDiff to 1>><</if>>
<<if ndef $techTrialVideo or !$techTrialVideo>><<set $techTrialVideo to "career/story/t4.webm">><</if>>
<</silently>>
<style>
html.ft-tech-trial #ui-bar,
html.ft-tech-trial #ui-bar-body,
html.ft-tech-trial #ui-bar-toggle { display: none !important; }
html.ft-tech-trial #story { margin: 0 !important; width: 100% !important; max-width: 100% !important; }
html.ft-tech-trial #passages,
html.ft-tech-trial .passage { margin: 0 !important; padding: 0 !important; max-width: none !important; width: 100% !important; }
#tech-stage {
position: fixed; inset: 0; z-index: 99980;
width: 100vw; height: 100vh; background: #000; overflow: hidden;
touch-action: none;
}
#tech-video {
position: absolute; inset: 0; width: 100%; height: 100%;
object-fit: cover; background: #000;
}
#tech-top {
position: absolute; top: 12px; left: 12px; right: 12px; z-index: 6;
display: flex; justify-content: space-between; gap: 10px; pointer-events: none;
}
#tech-top .chip {
background: rgba(0,0,0,0.62); color: #fff; padding: 8px 12px; border-radius: 12px;
font-weight: 700; font-size: 0.92rem; border: 1px solid rgba(186,85,211,0.35);
text-shadow: 0 1px 4px #000;
}
#tech-playfield {
position: absolute; left: 0; right: 0; bottom: 0; height: 42%;
z-index: 4; background: linear-gradient(to top, rgba(0,0,0,0.5), rgba(0,0,0,0.08));
}
#tech-canvas {
position: absolute; inset: 0; width: 100%; height: 100%; z-index: 5;
}
#tech-bottom {
position: absolute; left: 0; right: 0; bottom: 12px; z-index: 7;
display: flex; justify-content: center; gap: 10px; pointer-events: none;
}
#tech-bottom button {
pointer-events: auto; padding: 10px 16px; border-radius: 999px;
border: 1px solid rgba(186,85,211,0.5); background: rgba(20,12,28,0.78);
color: #f3e5f5; font-weight: 700; cursor: pointer; font-size: 0.9rem;
}
#tech-bottom button.is-on { border-color: rgba(105,240,174,0.55); color: #b9f6ca; }
#tech-start, #tech-end {
position: absolute; inset: 0; z-index: 10;
display: flex; flex-direction: column; align-items: center; justify-content: center;
gap: 12px; background: rgba(8,4,14,0.55); color: #f3e5f5; text-align: center; padding: 24px;
}
#tech-end { display: none; background: rgba(8,4,14,0.72); }
#tech-start h3, #tech-end h3 { margin: 0; color: #e1bee7; font-size: 1.5rem; text-shadow: 0 2px 10px #000; }
#tech-start p { margin: 0; max-width: 480px; line-height: 1.45; text-shadow: 0 1px 6px #000; }
#tech-start-btn, #tech-end-nav button {
padding: 14px 32px; font-size: 1.1rem; font-weight: 700; border-radius: 999px;
border: 1px solid #ba55d3; background: rgba(186,85,211,0.6); color: #fff; cursor: pointer;
}
#tech-end-nav { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; }
#tech-end-nav button { font-size: 0.95rem; padding: 10px 18px; background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.3); }
#tech-score-big { font-size: 2.4rem; font-weight: 800; color: #e1bee7; }
#tech-status {
position: absolute; top: 58px; left: 50%; transform: translateX(-50%); z-index: 6;
color: #fff; font-weight: 700; text-shadow: 0 2px 8px #000;
background: rgba(0,0,0,0.45); padding: 6px 12px; border-radius: 10px;
pointer-events: none; display: none;
}
</style>
<div id="tech-stage">
<video id="tech-video" autoplay loop muted playsinline>
<source @src="$techTrialVideo" type="video/webm">
</video>
<div id="tech-top">
<div class="chip">One-path · Diff <<print $techTrialDiff>></div>
<div class="chip">⏱ <b id="tech-clock">—</b> · On-path <b id="tech-live">—</b></div>
</div>
<div id="tech-status"></div>
<div id="tech-playfield">
<canvas id="tech-canvas"></canvas>
</div>
<div id="tech-bottom">
<button type="button" id="tech-mute-btn">🔇 Unmute</button>
<button type="button" id="tech-score-btn">Score: —</button>
</div>
<div id="tech-start">
<h3>One-path Trace</h3>
<p>Press ▶ Ready, then put your cursor on <b>START</b> and drag along the path to <b>FINISH</b>.<br>
Timer starts when you leave START. Stay on the line — the video is the distraction.</p>
<button type="button" id="tech-start-btn">▶ Ready</button>
</div>
<div id="tech-end">
<h3>Result</h3>
<div id="tech-score-big">0%</div>
<div id="tech-summary"></div>
<div id="tech-end-nav">
<button type="button" id="tech-again">Again</button>
<button type="button" id="tech-menu">Trial menu</button>
<button type="button" id="tech-exit">Exit</button>
</div>
</div>
</div>
<<script>>
(function () {
function boot() {
var stage = document.getElementById('tech-stage');
if (!stage || stage.dataset.booted) return;
stage.dataset.booted = '1';
try { if (window.FT_uiBar) FT_uiBar.remember(); } catch (e) {}
document.documentElement.classList.add('ft-tech-trial');
try { if (typeof UIBar !== 'undefined' && UIBar.stow) UIBar.stow(true); } catch (e) {}
var diff = Number(State.variables.techTrialDiff) || 1;
var video = document.getElementById('tech-video');
if (video) {
var vpath = State.variables.techTrialVideo || 'career/story/t4.webm';
var srcEl = video.querySelector('source');
if (srcEl) { srcEl.setAttribute('src', vpath); video.load(); }
try { video.muted = true; video.play(); } catch (e) {}
}
var canvas = document.getElementById('tech-canvas');
var clockEl = document.getElementById('tech-clock');
var liveEl = document.getElementById('tech-live');
var statusEl = document.getElementById('tech-status');
var scoreBtn = document.getElementById('tech-score-btn');
// Visual width vs hit width: hit is more forgiving than the drawn line
var pathWidth = diff === 1 ? 32 : diff === 2 ? 24 : 17; // drawn stroke
var hitMul = diff === 1 ? 0.95 : diff === 2 ? 0.85 : 0.75; // of pathWidth for "on path"
var timeLimit = diff === 1 ? 22 : diff === 2 ? 20 : 18;
var offPathGrace = diff === 1 ? 1.8 : diff === 2 ? 1.35 : 1.0; // seconds off-path before fail
var pathPts = [];
var startZone = null; // {x,y,r}
var finishZone = null;
var ready = false; // after Ready button
var armed = false; // pointer down in start
var raced = false; // left start — timer running
var finished = false;
var pointer = null;
var drawing = false;
var tLeft = timeLimit;
var tickTimer = null;
var raf = null;
var onSamples = 0, totalSamples = 0;
var offAccum = 0;
var progress = 0; // 0..1 along path index
var soundOn = false;
var score = 0;
function setStatus(t) {
if (!statusEl) return;
statusEl.style.display = t ? 'block' : 'none';
statusEl.textContent = t || '';
}
function resize() {
var pf = document.getElementById('tech-playfield');
if (!pf || !canvas) return;
var r = pf.getBoundingClientRect();
canvas.width = Math.max(320, Math.floor(r.width));
canvas.height = Math.max(160, Math.floor(r.height));
}
/** Build a continuous curvy path with optional loop; always left→right overall */
function buildPath() {
var w = canvas.width, h = canvas.height;
// Key waypoints: mix of horizontal runs, vertical drops/climbs, zigzags, curves
// Progress is still roughly left→right overall so FINISH stays on the right
var amp = diff === 1 ? 1.0 : diff === 2 ? 1.15 : 1.3;
var keys = [];
function add(nx, ny) {
keys.push({
x: Math.max(w * 0.04, Math.min(w * 0.96, nx * w)),
y: Math.max(h * 0.10, Math.min(h * 0.90, ny * h))
});
}
// START left-center
add(0.06, 0.55);
// short horizontal
add(0.14, 0.55);
// vertical climb
add(0.14, 0.22);
// horizontal top run
add(0.28, 0.20);
// zigzag down-right
add(0.32, 0.42);
add(0.38, 0.22);
add(0.44, 0.48);
// vertical drop
add(0.44, 0.78);
// horizontal bottom
add(0.56, 0.80);
// climb with curve feel via mid points
add(0.58, 0.50);
add(0.62, 0.28);
// mid loop-ish square detour (stronger on higher diff)
if (diff >= 1) {
add(0.70, 0.28);
add(0.72, 0.55);
add(0.64, 0.55);
add(0.64, 0.35);
add(0.74, 0.35);
}
// zigzag toward end
add(0.78, 0.55);
add(0.82, 0.30);
add(0.86, 0.70);
if (diff >= 2) {
add(0.88, 0.40);
add(0.90, 0.65);
}
if (diff >= 3) {
add(0.91, 0.35);
add(0.93, 0.60);
add(0.94, 0.42);
}
// FINISH
add(0.96, 0.50);
// Scale vertical excursions by amp slightly toward center for diff 1 softness
if (diff === 1) {
for (var ki = 1; ki < keys.length - 1; ki++) {
keys[ki].y = h * 0.50 + (keys[ki].y - h * 0.50) * 0.85;
}
}
// Densify: straight segments + slight sine on long runs so it's not pure ruler lines
pathPts = [];
for (var i = 0; i < keys.length - 1; i++) {
var a = keys[i], b = keys[i + 1];
var dx = b.x - a.x, dy = b.y - a.y;
var dist = Math.hypot(dx, dy);
var steps = Math.max(6, Math.floor(dist / 8));
for (var s = 0; s < steps; s++) {
var t = s / steps;
var x = a.x + dx * t;
var y = a.y + dy * t;
// micro-wave along segment so "black waves" appear on long stretches
var nx = -dy / (dist || 1), ny = dx / (dist || 1);
var wave = Math.sin(t * Math.PI * (diff >= 3 ? 3 : 2)) * (diff === 1 ? 3.5 : diff === 2 ? 5 : 6.5);
// only wave if segment is mostly horizontal or vertical long enough
if (dist > 40) {
x += nx * wave;
y += ny * wave;
}
pathPts.push({ x: x, y: y });
}
}
pathPts.push(keys[keys.length - 1]);
// light smooth — preserve corners more than before (1 pass only)
var sm = [pathPts[0]];
for (var j = 1; j < pathPts.length - 1; j++) {
// less smoothing near sharp direction changes
var prev = pathPts[j - 1], cur = pathPts[j], next = pathPts[j + 1];
var ang = Math.abs(Math.atan2(next.y - cur.y, next.x - cur.x) - Math.atan2(cur.y - prev.y, cur.x - prev.x));
if (ang > Math.PI) ang = Math.abs(ang - Math.PI * 2);
if (ang > 0.9) {
sm.push(cur); // keep corner
} else {
sm.push({
x: (prev.x + cur.x * 2 + next.x) / 4,
y: (prev.y + cur.y * 2 + next.y) / 4
});
}
}
sm.push(pathPts[pathPts.length - 1]);
pathPts = sm;
var s0 = pathPts[0];
var f0 = pathPts[pathPts.length - 1];
startZone = { x: s0.x, y: s0.y, r: Math.max(pathWidth * 1.35, 28) };
finishZone = { x: f0.x, y: f0.y, r: Math.max(pathWidth * 1.35, 28) };
}
function distToSegment(px, py, a, b) {
var dx = b.x - a.x, dy = b.y - a.y;
var len2 = dx * dx + dy * dy || 1;
var t = Math.max(0, Math.min(1, ((px - a.x) * dx + (py - a.y) * dy) / len2));
var qx = a.x + t * dx, qy = a.y + t * dy;
return { d: Math.hypot(px - qx, py - qy), t: t, idx: 0 };
}
function nearestOnPath(px, py) {
var best = { d: 1e9, idx: 0, t: 0 };
for (var i = 0; i < pathPts.length - 1; i++) {
var r = distToSegment(px, py, pathPts[i], pathPts[i + 1]);
if (r.d < best.d) best = { d: r.d, idx: i, t: r.t };
}
best.progress = (best.idx + best.t) / (pathPts.length - 1);
return best;
}
function inCircle(p, zone) {
return Math.hypot(p.x - zone.x, p.y - zone.y) <= zone.r;
}
function draw() {
if (!canvas) return;
var ctx = canvas.getContext('2d');
var w = canvas.width, h = canvas.height;
ctx.clearRect(0, 0, w, h);
// path underglow + stroke
ctx.lineCap = 'round';
ctx.lineJoin = 'round';
ctx.strokeStyle = 'rgba(255,255,255,0.18)';
ctx.lineWidth = pathWidth + 12;
ctx.beginPath();
pathPts.forEach(function (p, i) { if (i === 0) ctx.moveTo(p.x, p.y); else ctx.lineTo(p.x, p.y); });
ctx.stroke();
ctx.strokeStyle = raced ? 'rgba(186,85,211,0.9)' : 'rgba(186,85,211,0.7)';
ctx.lineWidth = pathWidth;
ctx.beginPath();
pathPts.forEach(function (p, i) { if (i === 0) ctx.moveTo(p.x, p.y); else ctx.lineTo(p.x, p.y); });
ctx.stroke();
// progress highlight
if (raced && progress > 0) {
var upto = Math.max(1, Math.floor(progress * (pathPts.length - 1)));
ctx.strokeStyle = 'rgba(105,240,174,0.75)';
ctx.lineWidth = pathWidth * 0.45;
ctx.beginPath();
for (var i = 0; i <= upto; i++) {
var p = pathPts[i];
if (i === 0) ctx.moveTo(p.x, p.y); else ctx.lineTo(p.x, p.y);
}
ctx.stroke();
}
function drawZone(zone, label, color) {
ctx.beginPath();
ctx.arc(zone.x, zone.y, zone.r, 0, Math.PI * 2);
ctx.fillStyle = color;
ctx.fill();
ctx.strokeStyle = '#fff';
ctx.lineWidth = 2;
ctx.stroke();
ctx.fillStyle = '#fff';
ctx.font = 'bold 11px system-ui,sans-serif';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(label, zone.x, zone.y);
}
drawZone(startZone, 'START', 'rgba(33,150,243,0.85)');
drawZone(finishZone, 'FINISH', 'rgba(76,175,80,0.85)');
if (pointer) {
var near = nearestOnPath(pointer.x, pointer.y);
var on = near.d <= pathWidth * hitMul;
ctx.beginPath();
ctx.arc(pointer.x, pointer.y, 11, 0, Math.PI * 2);
ctx.fillStyle = on ? 'rgba(105,240,174,0.95)' : 'rgba(255,82,82,0.95)';
ctx.fill();
ctx.strokeStyle = '#fff';
ctx.lineWidth = 2;
ctx.stroke();
}
}
function endRun(reason) {
if (finished) return;
finished = true;
raced = false;
clearInterval(tickTimer);
if (raf) cancelAnimationFrame(raf);
var pathPct = totalSamples ? (onSamples / totalSamples) : 0;
var progBonus = progress;
// score: mostly completion + on-path accuracy + leftover time
score = Math.round(
progBonus * 55 +
pathPct * 35 +
(reason === 'finish' ? Math.min(15, tLeft) : 0)
);
score = Math.max(0, Math.min(100, score));
State.variables.techTrialLastScore = score;
if (State.variables.mg_ProductionLaunch) {
State.variables.mg_ProductionLaunch = false;
if (typeof cleanup === "function") cleanup();
if (typeof FT_finishMinigame === "function") {
setTimeout(function () { FT_finishMinigame(score); }, 400);
}
return;
}
var big = document.getElementById('tech-score-big');
var sum = document.getElementById('tech-summary');
if (big) big.textContent = score + '%';
if (sum) {
sum.textContent = reason + ' · Progress ' + Math.round(progress * 100) +
'% · On-path ' + Math.round(pathPct * 100) + '% · Diff ' + diff;
}
if (scoreBtn) scoreBtn.textContent = 'Score: ' + score + '%';
if (liveEl) liveEl.textContent = Math.round(pathPct * 100) + '%';
setStatus('');
document.getElementById('tech-end').style.display = 'flex';
}
function frame() {
if (finished) return;
if (pointer && raced) {
totalSamples++;
var near = nearestOnPath(pointer.x, pointer.y);
var on = near.d <= pathWidth * hitMul;
if (on) {
onSamples++;
offAccum = 0;
// only advance progress forward along path
if (near.progress > progress) progress = near.progress;
} else {
offAccum += 1 / 60;
if (offAccum >= offPathGrace) {
endRun('Left the path.');
return;
}
}
if (inCircle(pointer, finishZone) && progress > 0.82) {
progress = 1;
endRun('Finished!');
return;
}
var pct = totalSamples ? Math.round((onSamples / totalSamples) * 100) : 0;
if (liveEl) liveEl.textContent = pct + '%';
if (scoreBtn) scoreBtn.textContent = 'Score: ' + Math.round(progress * 55 + pct * 0.35) + '%';
}
draw();
raf = requestAnimationFrame(frame);
}
function canvasPos(e) {
var r = canvas.getBoundingClientRect();
var src = e.touches ? e.touches[0] : e;
return {
x: (src.clientX - r.left) * (canvas.width / r.width),
y: (src.clientY - r.top) * (canvas.height / r.height)
};
}
function onDown(e) {
if (!ready || finished) return;
e.preventDefault();
drawing = true;
pointer = canvasPos(e);
if (!raced && inCircle(pointer, startZone)) {
armed = true;
setStatus('Drag along the path → FINISH');
}
draw();
}
function onMove(e) {
if (!ready || finished || !drawing) return;
e.preventDefault();
pointer = canvasPos(e);
if (armed && !raced) {
// start timer once they leave start zone while armed
if (!inCircle(pointer, startZone)) {
raced = true;
tLeft = timeLimit;
if (clockEl) clockEl.textContent = tLeft.toFixed(1);
setStatus('Go!');
tickTimer = setInterval(function () {
if (!raced || finished) return;
tLeft -= 0.1;
if (clockEl) clockEl.textContent = Math.max(0, tLeft).toFixed(1);
if (tLeft <= 0) endRun('Time up.');
}, 100);
}
}
}
function onUp() {
drawing = false;
// if race started and they release, still allow continue if they press again on path soon —
// but treat long release off path as fail only via offAccum while moving.
// If they release mid-race, keep raced true so they can put finger back.
}
function beginReady() {
document.getElementById('tech-start').style.display = 'none';
document.getElementById('tech-end').style.display = 'none';
resize();
buildPath();
ready = true;
armed = false;
raced = false;
finished = false;
pointer = null;
drawing = false;
onSamples = totalSamples = 0;
offAccum = 0;
progress = 0;
tLeft = timeLimit;
if (clockEl) clockEl.textContent = '—';
if (liveEl) liveEl.textContent = '—';
if (scoreBtn) scoreBtn.textContent = 'Score: —';
setStatus('Touch START, then follow the path');
if (video) try { video.play(); } catch (e) {}
draw();
if (raf) cancelAnimationFrame(raf);
raf = requestAnimationFrame(frame);
}
function cleanup() {
finished = true;
raced = false;
clearInterval(tickTimer);
if (raf) cancelAnimationFrame(raf);
document.documentElement.classList.remove('ft-tech-trial');
try { if (window.FT_uiBar) FT_uiBar.restore(); else if (typeof UIBar !== 'undefined' && UIBar.unstow) UIBar.unstow(); } catch (e) {}
}
canvas.addEventListener('mousedown', onDown);
canvas.addEventListener('mousemove', onMove);
window.addEventListener('mouseup', onUp);
canvas.addEventListener('touchstart', onDown, { passive: false });
canvas.addEventListener('touchmove', onMove, { passive: false });
canvas.addEventListener('touchend', onUp);
document.getElementById('tech-start-btn').onclick = beginReady;
document.getElementById('tech-mute-btn').onclick = function () {
soundOn = !soundOn;
if (video) { video.muted = !soundOn; if (soundOn) try { video.play(); } catch (e) {} }
this.textContent = soundOn ? '🔊 Mute' : '🔇 Unmute';
this.classList.toggle('is-on', soundOn);
};
document.getElementById('tech-again').onclick = function () { cleanup(); Engine.play('Technique Trial Play'); };
document.getElementById('tech-menu').onclick = function () { cleanup(); Engine.play('Technique Trial'); };
document.getElementById('tech-exit').onclick = function () { cleanup(); Engine.play('Debug Menu'); };
$(document).one(':passageend', cleanup);
window.addEventListener('resize', function () {
if (!ready || finished) return;
resize();
buildPath();
draw();
});
}
$(document).one(':passagedisplay', boot);
setTimeout(boot, 0);
setTimeout(boot, 50);
})();
<</script>><div class="passage-title">Debug Menu</div>
<div class="panel">
<div class="panel-title">Developer tools</div>
<span class="hint">Opened from Mall with <b>Y</b>. Changes apply immediately.</span>
</div>
<div class="sidebar-panel" style="max-width:640px;">
<h3 style="color:#ce93d8;">Quick jumps</h3>
<div class="nav-grid">
[[Bedroom|Bedroom Hub]]
[[City|City]]
[[Phone|Phone]]
[[Joy Media|Joy Media Studios]]
[[Escort|Escort Agency]]
[[Mall|Mall]]
</div>
</div>
<div class="panel">
<div class="panel-title">Economy & time</div>
Money: <b>$<<print $money>></b>
<div class="nav-grid">
<<link "+$500">><<set $money += 500>><<goto "Debug Menu">><</link>>
<<link "+$1500">><<set $money += 1500>><<goto "Debug Menu">><</link>>
<<link "Money = 0">><<set $money to 0>><<goto "Debug Menu">><</link>>
<<link "Money = 5000">><<set $money to 5000>><<goto "Debug Menu">><</link>>
</div>
Debt owed: <b>$<<print $debt>></b> · Weekly: <b>$<<print $debtWeekly>></b> · Days left: <b><<print $debtDaysLeft>></b>
<div class="nav-grid">
<<link "Debt = 0">><<set $debt to 0>><<goto "Debug Menu">><</link>>
<<link "Debt += 1500">><<set $debt += 1500>><<goto "Debug Menu">><</link>>
<<link "Days left = 1">><<set $debtDaysLeft to 1>><<set $debtActive to true>><<goto "Debug Menu">><</link>>
<<link "Reset week (7 days)">><<set $debtDaysLeft to 7>><<set $debtActive to true>><<goto "Debug Menu">><</link>>
<<link "Trigger debt deadline">><<set $debtActive to true>><<set $debtDaysLeft to 0>><<goto "Debt Deadline">><</link>>
</div>
Week <b><<print $weekNumber>></b> · Day <b><<print $dayOfWeek>></b> · Actions <b><<print $actionsLeft>>/<<print $actionsMax>></b>
<div class="nav-grid">
<<link "Actions = 3">><<set $actionsLeft to 3>><<set $actionsUsedToday to 0>><<goto "Debug Menu">><</link>>
<<link "Actions = 0">><<set $actionsLeft to 0>><<goto "Debug Menu">><</link>>
<<link "+1 day (sleep)">><<goto "Sleep Sequence">><</link>>
<<link "Skip to career unlock">><<set $systemsUnlocked to true>><<set $careerStarted to true>><<set $debtActive to true>><<set $statFocus to 2>><<set $statTechnique to 2>><<set $statStamina to 2>><<goto "Debug Menu">><</link>>
</div>
</div>
<div class="panel">
<div class="panel-title">Body / locks</div>
Exhaustion <b><<print $exhaustion>>/<<print $exhaustionMax>></b> · Mood <b><<print $mood>>/<<print $moodMax>></b>
<div class="nav-grid">
<<link "Exhaustion 0">><<set $exhaustion to 0>><<set $exhaustionLocked to false>><<goto "Debug Menu">><</link>>
<<link "Exhaustion max">><<set $exhaustion to $exhaustionMax>><<goto "Debug Menu">><</link>>
<<link "Mood full">><<set $mood to $moodMax>><<goto "Debug Menu">><</link>>
<<link "Mood 0">><<set $mood to 0>><<goto "Debug Menu">><</link>>
<<link "Clear work lock">><<set $exhaustionLocked to false>><<set $exhaustionLockDays to 0>><<goto "Debug Menu">><</link>>
</div>
Skills — F <b><<print $statFocus>></b> · T <b><<print $statTechnique>></b> · S <b><<print $statStamina>></b>
<div class="nav-grid">
<<link "All skills 2">><<set $statFocus to 2>><<set $statTechnique to 2>><<set $statStamina to 2>><<goto "Debug Menu">><</link>>
<<link "All skills 5">><<set $statFocus to 5>><<set $statTechnique to 5>><<set $statStamina to 5>><<goto "Debug Menu">><</link>>
<<link "All skills 1">><<set $statFocus to 1>><<set $statTechnique to 1>><<set $statStamina to 1>><<goto "Debug Menu">><</link>>
</div>
</div>
<div class="panel">
<div class="panel-title">Progress flags</div>
Swallow index <b><<print $swallowIndex || 0>></b> · Secrets index <b><<print $secretsIndex || 0>></b> · Escort index <b><<print $escortIndex || 0>></b>
<div class="nav-grid">
<<link "Swallow = 4 (pre-Rebel)">><<set $swallowIndex to 4>><<set $gloryholeSwallowCount to 4>><<goto "Debug Menu">><</link>>
<<link "Swallow = 5 (post-Rebel1)">><<set $swallowIndex to 5>><<set $gloryholeSwallowCount to 5>><<set $unlockedGloryholeSecrets to true>><<goto "Debug Menu">><</link>>
<<link "Swallow = 8 (Rebel2 done)">><<set $swallowIndex to 8>><<set $gloryholeSwallowCount to 8>><<set $sceneCompleted["ghs_rebel2"] to true>><<set $rebelVisit2Ready to true>><<set $pendingRebelMeet to 2>><<goto "Debug Menu">><</link>>
<<link "Unlock Secrets">><<set $unlockedGloryholeSecrets to true>><<goto "Debug Menu">><</link>>
<<link "Unlock Cuckold">><<set $unlockedCuckoldEscort to true>><<set $rebelVisit2Done to true>><<goto "Debug Menu">><</link>>
<<link "Clear same-day locks">><<set $studioSameDayLock to false>><<set $swallowSameDayLock to false>><<set $initiationSameDayLock to false>><<set $secretsSameDayLock to false>><<set $escortSameDayLock to false>><<set $camSameDayLock to false>><<goto "Debug Menu">><</link>>
</div>
</div>
<div class="panel">
<div class="panel-title">Scene completion toggles</div>
<span class="hint">Click to mark done / not done.</span>
<<silently>>
<<if ndef $sceneCompleted or !$sceneCompleted>><<set $sceneCompleted to {}>><</if>>
<<set _debugScenes to [
"ghs_catherine","ghs_luna","ghs_courtney","ghs_nikki","ghs_rebel","ghs_emma","ghs_chantell","ghs_rebel2","ghs_yaya","ghs_indica",
"ghx_tommy","ghx_lauren","ghx_cory","ghx_violet","ghx_ella","ghx_nia",
"esc_japanese","esc_pregnant","esc_middleeast","esc_executive","esc_soccermom","esc_cuckold",
"cam_first","cam_toy","cam_fleshlight","cam_interactive",
"debt_week1","debt_week2"
]>>
<</silently>>
<<for _sid range _debugScenes>>
<div class="stat-row" style="max-width:520px;">
<span class="label"><<print _sid>></span>
<span class="val">
<<if $sceneCompleted[_sid]>>
<span class="stat-good">DONE</span>
<<link "[clear]">>
<<set $sceneCompleted[_sid] to false>>
<<goto "Debug Menu">>
<</link>>
<<else>>
<span class="stat-warn">—</span>
<<link "[complete]">>
<<set $sceneCompleted[_sid] to true>>
<<goto "Debug Menu">>
<</link>>
<</if>>
</span>
</div>
<</for>>
<div class="nav-grid" style="margin-top:10px;">
<<link "Mark all Swallow done">><<set $sceneCompleted["ghs_catherine"] to true>><<set $sceneCompleted["ghs_luna"] to true>><<set $sceneCompleted["ghs_courtney"] to true>><<set $sceneCompleted["ghs_nikki"] to true>><<set $sceneCompleted["ghs_rebel"] to true>><<set $sceneCompleted["ghs_emma"] to true>><<set $sceneCompleted["ghs_chantell"] to true>><<set $sceneCompleted["ghs_rebel2"] to true>><<set $sceneCompleted["ghs_yaya"] to true>><<set $sceneCompleted["ghs_indica"] to true>><<set $swallowIndex to 10>><<set $gloryholeSwallowCount to 10>><<set $unlockedGloryholeSecrets to true>><<goto "Debug Menu">><</link>>
<<link "Clear all scene flags">><<set $sceneCompleted to {}>><<set $swallowIndex to 0>><<set $secretsIndex to 0>><<set $escortIndex to 0>><<goto "Debug Menu">><</link>>
</div>
</div>
<div class="nav-grid">
<<link "Force version-end ready">><<set $versionEndReady to true>><<goto "Version Complete">><</link>>
[[Focus Trial (prototype)|Focus Trial]]
[[Stamina Trial (prototype)|Stamina Trial]]
[[Technique Trial (prototype)|Technique Trial]]
[[Close → Mall|Mall]]
[[Close → City|City]]
[[Close → Bedroom|Bedroom Hub]]
</div><<goto "Bedroom Hub">><<set $pendingRebelMeet to 0>>
<<set $rebelVisit2Done to true>>
<<set $rebelVisit1Done to true>>
<<set $husbandMeetPending to false>>
<<set $husbandMeetDone to true>>
<<set $unlockedCuckoldEscort to true>>
<div class="passage-title">Drinks with Rebel’s Husband</div>
<div class="story-img"><img src="career/pics/story/rebel_bar.jpg" alt="Bar meet" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
Rebel is at the bar. Her husband stands when you arrive — wedding ring, steady smile, no hostility.
<<speech "husband" "Rebel’s Husband">>$playerName. Sit. Drink’s on me.<</speech>>
<<speech "you">>…Okay.<</speech>>
<<speech "husband" "Rebel’s Husband">>I was in the studio for both of those booth sets. Camera side. Watched you put two full loads in my wife while Lulu helped clean the mess.<</speech>>
<<speech "rebel" "Rebel Rhyder">>He doesn’t get jealous. He gets ideas.<</speech>>
<<speech "husband" "Rebel’s Husband">>Thank you — seriously. Seeing a rookie handle her like that, twice, told me you’re not going to freeze when a husband is in the chair on purpose.<</speech>>
<<speech "husband" "Rebel’s Husband">>I’m recommending you to the escort desk. Couples who want a real cuckold experience. She sets the rules. I watch. You perform. Better money than amateur holes if you keep your head.<</speech>>
<<speech "you">>I can do that.<</speech>>
<<speech "rebel" "Rebel Rhyder">>Good. When the agency opens a cuckold slot, take it. We’ll vouch.<</speech>>
<<silently>>
<<set $actressRelation["rebel_rhyder"] to ($actressRelation["rebel_rhyder"] || 0) + 12>>
<<if $chats>>
<<for _c range $chats>>
<<if _c.id === "rebel">><<set _c.action to null>><</if>>
<</for>>
<</if>>
<</silently>>
<div class="reward">Cuckold escort path unlocked. The agency will treat you as recommended talent.</div>
<div class="nav-grid">[[City|City]] [[Bedroom|Bedroom Hub]]</div><<silently>>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<<unset $mg_Score1>>
<</silently>>
<div class="passage-title">Cam Setup</div>
<div class="story-img"><img src="career/pics/loc/cam_desk.jpg" alt="Cam setup" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);"></div>
<<if not $camUnlocked>>
Locked until Rebecca unlocks cam work.
[[Bedroom|Bedroom Hub]]
<<elseif $exhaustionLocked or $actionsLeft < 1>>
Can’t stream right now.
[[Bedroom|Bedroom Hub]]
<<else>>
<<set $camOrder to ["cam_first","cam_toy","cam_fleshlight","cam_interactive"]>>
<<set $camNames to {
"cam_first": "First Time Camming",
"cam_toy": "Toy Show",
"cam_fleshlight": "Fleshlight Show",
"cam_interactive": "Interactive Fleshlight"
}>>
<<if ndef $camIndex>><<set $camIndex to 0>><</if>>
<<set $camPortraits to {
"cam_first": "career/pics/avatars/cam_first.jpg",
"cam_toy": "career/pics/avatars/cam_toy.jpg",
"cam_fleshlight": "career/pics/avatars/cam_fleshlight.jpg",
"cam_interactive": "career/pics/avatars/cam_interactive.jpg"
}>>
<div class="panel panel-tight">
<div class="panel-title">Stream queue</div>
<<if $camSameDayLock>>
<span class="hint">Already streamed today. Sleep for the next show slot.</span>
<<elseif not $camStoryDone and $camIndex < $camOrder.length>>
<<silently>>
<<set _id to $camOrder[$camIndex]>>
<<set _name to $camNames[_id]>>
<<set _img to ($camPortraits[_id] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _id>>
<<set _sess to $camIndex + 1>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_id) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card is-next'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Show " + _sess + " · Available" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<div class="scene-card-grid scene-card-grid-single"><<link _cardHtml _spass>><</link>></div>
<<else>>
<<set $camStoryDone to true>>
<div class="hint">Story shows done — repeatable streams:</div>
<div class="scene-card-grid">
<<for _id range $camOrder>>
<<silently>>
<<set _name to $camNames[_id]>>
<<set _img to ($camPortraits[_id] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _id>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_sid) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Repeat" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<<link _cardHtml _spass>><</link>>
<</for>>
</div>
<</if>>
</div>
Cam rep: $camRep · Tokens: $camTokens · Shows: $camShows
<div class="nav-grid">[[Bedroom|Bedroom Hub]]</div>
<</if>><<if $exhaustion >= $exhaustionMax>>
<<set $exhaustion to 100>>
<<set $exhaustionLocked to true>>
<<set $exhaustionLockDays to 1>>
You are completely exhausted. Your body forces you to stop working for 3 days.
[[Continue|Bedroom Hub]]
<<else>>
<<goto $returnAfterExhaustion>>
<</if>><<if $actionsLeft < 1>>
No actions left.
[[City|City]]
<<else>>
<<set $actionsLeft -= 1>>
<<set _id to $interactStar>>
<<set _name to _id.replace(/_/g, " ")>>
<<set $actressRelation[_id] to ($actressRelation[_id] || 0) + 5>>
<<set _rel to $actressRelation[_id]>>
You spend time with <<print _name>> away from set — coffee, a short walk, industry talk.
<<if _id === "rebel_rhyder">>
<<if _rel >= 25>>
<<speech "rebel">>You’re not just booth meat anymore. I might pull you into something private. Stay useful.<</speech>>
<div style="color:#00e676;">Rebel trust high — future private scene path open (flag ready).</div>
<<set $rebelPrivateReady to true>>
<<elseif _rel >= 15>>
<<speech "rebel">>You lasted longer last time. Don’t get cocky. Text me when you improve.<</speech>>
<<else>>
<<speech "rebel">>Cute. Still green. Buy me another coffee when you’re less nervous.<</speech>>
<</if>>
<<elseif _id === "kira_noir">>
<<if _rel >= 25>>
<<speech "kira">>Dogfart remembers names. Keep your reputation clean and I might vouch for a real slot.<</speech>>
<div style="color:#00e676;">Kira vouch ready — Dogfart relation boost unlocked.</div>
<<set $kiraVouchReady to true>>
<<set $studioRelation["dogfart"] to Math.max($studioRelation["dogfart"], 10)>>
<<elseif _rel >= 15>>
<<speech "kira">>You’re improving. Don’t waste it on trash sets.<</speech>>
<<else>>
<<speech "kira">>Still proving yourself. Talk is cheap in this town.<</speech>>
<</if>>
<<else>>
<<if _rel >= 20>>
They laugh easier now. A real connection is forming — that can mean better chemistry on camera later.
<<else>>
Polite, professional, a little curious. Relation is building.
<</if>>
<</if>>
**<<print _name>> relation +5** (now $_rel) | Action –1
[[Return to City|City]]
[[Go Home|Bedroom Hub]]
<</if>><<if $actionsLeft < 1>>
You're out of actions for today. Sleep to advance to the next day.
[[Go Home|Bedroom Hub]]
<<else>>
<<goto $returnAfterAction>>
<</if>>There is a lot of future in this game as I foresee I will keep it open in the sense That there will be a lot of choices a lot of different endings not just a linear story you can customize the protagonist you can play as a black Dom or black sub. You can be a white Sub too trying to have a career in the porn industry.
Will be adding a lot of scenes with new and upcoming models and favorite artists, will be touching on many genres BDSM,cuckold, sissification, prostitution, etc
Thank you for your support.
you can now go back to the original game [[House Hub]]<<silently>>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<<unset $mg_Score1>>
<</silently>>
<div class="passage-title">Gloryhole Initiation</div>
<div class="story-img"><img src="career/pics/loc/gloryhole_initiation.jpg" alt="Dogfart gloryhole set" style="width:100%;max-width:950px;height:auto;border-radius:14px;display:block;margin:0.85em 0;box-shadow:0 8px 28px rgba(0,0,0,0.35);" onerror="this.style.display='none'"></div>
Dogfart’s gloryhole floor. Nia got you through the door. Veterans work the booth one slate at a time. Actions: <b>$actionsLeft / $actionsMax</b>
<<if not $unlockedDogfart>>
The desk doesn’t know your name yet.
[[Back to Dogfart|Dogfart Studios]]
<<elseif $exhaustionLocked>>
Too exhausted to work.
[[Back to Dogfart|Dogfart Studios]]
<<elseif $actionsLeft < 1>>
No actions left today. Sleep to continue.
[[Back to Dogfart|Dogfart Studios]]
[[Go Home|Bedroom Hub]]
<<else>>
<<set $initiationOrder to ["ghi_nia","ghi_anna","ghi_kira","ghi_scarlit","ghi_victoria","ghi_alexis"]>>
<<set $initiationPatreon to ["ghi_cecilia","ghi_daizy"]>>
<<set $initiationNames to {
"ghi_anna": "Anna Foxxx",
"ghi_kira": "Kira Noir",
"ghi_scarlit": "Scarlit Scandal",
"ghi_victoria": "Victoria Cakes",
"ghi_alexis": "Alexis Tae",
"ghi_cecilia": "Cecilia Lion",
"ghi_daizy": "Daizy Cooper & Noemie Bilas",
"ghi_nia": "Nia Nacci"
}>>
<<if ndef $initiationIndex>><<set $initiationIndex to 0>><</if>>
<<silently>>
<<set $initiationPreviews to {
"ghi_anna": "career/pics/scenes/Ana_Foxxx_gloryhole_initiation_last.jpg",
"ghi_kira": "career/pics/scenes/Kira_Noir_gloryhole_initiation_last.jpg",
"ghi_scarlit": "career/pics/scenes/Scarlit_Scandal_gloryhole_initiation_last.jpg",
"ghi_victoria": "career/pics/scenes/Victoria_Cakes_gloryhole_initiation_last.jpg",
"ghi_alexis": "career/pics/scenes/Alexis_Tae_gloryhole_initiation_last.jpg",
"ghi_cecilia": "career/pics/scenes/Cecilia_Lion_gloryhole_initiation_last.jpg",
"ghi_daizy": "career/pics/scenes/daizy-cooper-noemie-bilas-3.jpg",
"ghi_nia": "career/pics/scenes/Nia_Nacci_gloryhole_initiation_last.jpg",
"ghi_demi": "career/pics/scenes/Demi_Sutra_gloryhole_initiation_last.jpg"
}>>
<<if not $initiationSameDayLock and not $studioSameDayLock and $initiationIndex < $initiationOrder.length>>
<<set _sid to $initiationOrder[$initiationIndex]>>
<<set _name to $initiationNames[_sid]>>
<<set _img to ($initiationPreviews[_sid] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _sid>>
<<set _sess to $initiationIndex + 1>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_sid) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card scene-preview is-next'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Session " + _sess + " · Available" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</if>>
<</silently>>
<div class="panel panel-tight">
<div class="panel-title">Dogfart queue</div>
<<if $initiationSameDayLock or $studioSameDayLock>>
<span class="hint">Already did a Dogfart scene today. Sleep for the next slot.</span>
<<elseif $initiationIndex >= $initiationOrder.length>>
<div class="hint" style="margin-bottom:8px;">Initiation queue complete. Book any of these again.</div>
<div class="scene-card-grid">
<<for _sid range $initiationOrder>>
<<silently>>
<<set _name to $initiationNames[_sid]>>
<<set _img to ($initiationPreviews[_sid] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _sid>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_sid) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card scene-preview'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Repeat" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<<link _cardHtml _spass>><</link>>
<</for>>
</div>
<<else>>
<div class="scene-card-grid scene-card-grid-single"><<link _cardHtml _spass>><</link>></div>
<</if>>
<div class="hint" style="margin-top:8px;">Progress: $initiationIndex / <<print $initiationOrder.length>></div>
</div>
<div class="panel panel-tight" style="border-color:rgba(251,146,60,0.55);">
<div class="panel-title">Patreon exclusive</div>
<<if $patreonInitiationUnlocked>>
<<if $initiationSameDayLock or $studioSameDayLock>>
<span class="hint">Unlocked. Sleep to shoot one of these.</span>
<</if>>
<div class="scene-card-grid">
<<for _sid range $initiationPatreon>>
<<silently>>
<<set _name to $initiationNames[_sid]>>
<<set _img to ($initiationPreviews[_sid] || "career/pics/avatars/female.avif")>>
<<set _spass to "Scene " + _sid>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_sid) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card scene-preview is-patreon is-next'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Patreon exclusive" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<<if $initiationSameDayLock or $studioSameDayLock>>
<<print _cardHtml>>
<<else>>
<<link _cardHtml _spass>><</link>>
<</if>>
<</for>>
</div>
<<else>>
<div class="scene-card-grid">
<<for _sid range $initiationPatreon>>
<<silently>>
<<set _name to $initiationNames[_sid]>>
<<set _img to ($initiationPreviews[_sid] || "career/pics/avatars/female.avif")>>
<<set _oddsTxt to ($skipMinigames ? " · " + FT_sceneOdds(_sid) + "% good" : "")>>
<<set _cardHtml to "<div class='scene-card scene-preview is-patreon is-next'><img src='" + _img + "' alt='" + _name + "' onerror=\"this.src='career/pics/avatars/female.avif'\"><div class='sc-meta'><div class='sc-session'>Patreon exclusive" + _oddsTxt + "</div><div class='sc-name'>" + _name + "</div></div></div>">>
<</silently>>
<<link _cardHtml "Patreon Code">><</link>>
<</for>>
</div>
<div class="hint" style="margin-top:8px;">Both scenes unlock together with a supporter code.</div>
<</if>>
</div>
<div class="nav-grid">[[Back to Dogfart|Dogfart Studios]]</div>
<</if>><div class="passage-title">Patreon exclusive</div>
<div class="panel">
<div class="panel-title">Supporter code</div>
Enter the code to unlock Cecilia Lion and Daizy Cooper & Noemie Bilas.
<<textbox "$patreonCodeInput" "">>
<<if $patreonCodeBad>>
<div class="danger" style="margin-top:8px;">That code didn’t match.</div>
<</if>>
</div>
<<link "Unlock">>
<<set $patreonCodeBad to false>>
<<set _ok to FT_checkPatreon($patreonCodeInput)>>
<<if _ok>>
<<set $patreonInitiationUnlocked to true>>
<<set $patreonCodeInput to "">>
<<set $patreonCodeBad to false>>
<<goto "Gloryhole Initiation">>
<<else>>
<<set $patreonCodeBad to true>>
<<goto "Patreon Code">>
<</if>>
<</link>>
<div class="nav-grid">[[Back|Gloryhole Initiation]]</div><div class="passage-title">Anna Foxxx – Dogfart</div>
<<if ndef $sceneId or $sceneId !== "ghi_anna" or ndef $phase>>
<<set $sceneId to "ghi_anna">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<<set $sceneId to "ghi_anna">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a1.webm" type="video/webm"></video>
</div>
Anna sits in the booth like she owns the wall. One hand works over her panties while she looks at the camera, not the hole.
<<speech "producer" "Producer">>Good. Tell the site what you came to collect.<</speech>>
<<speech "anna" "Anna Foxxx">>A thick white one through the wall. That’s the product. I’m the girl who can take it.<</speech>>
<<speech "anna" "Anna Foxxx">>They booked a veteran on purpose. I can look pretty and still be filthy for the lens.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a2.webm" type="video/webm"></video>
</div>
Her fingers slip under the lace. She’s already wet and not hiding it.
<<speech "anna" "Anna Foxxx">>You hearing me out there? I want it thick. I want it white. I want it now.<</speech>>
<<speech "producer" "Producer">>Louder. Camera on the fingers, then her mouth.<</speech>>
<<speech "anna" "Anna Foxxx">>I’m getting myself ready for some stranger’s white cock and I’m not shy about saying it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a3.webm" type="video/webm"></video>
</div>
$playerName’s cock slides through. Anna smiles like she just won the booking and leans in immediately.
<<speech "anna" "Anna Foxxx">>There it is. White, heavy, and already a problem. Hi.<</speech>>
<<speech "producer" "Producer">>That’s the new kid. Don’t baby him, Anna. Lick.<</speech>>
<<speech "anna" "Anna Foxxx">>Newbie with a cock like that? Tongue first. Welcome to Initiations.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a4.webm" type="video/webm"></video>
</div>
She takes him deep on purpose, working her throat around the thickness.
<<speech "anna" "Anna Foxxx">>Thick white cock and a tight throat. That’s the thumbnail.<</speech>>
<<speech "producer" "Producer">>Let her work, kid. Don’t pull back.<</speech>>
<<speech "you">>I’m not pulling back.<</speech>>
/* FOCUS */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a5.webm" type="video/webm"></video>
</div>
No breaks. Spit runs down the shaft and onto her chin.
<<speech "anna" "Anna Foxxx">>Sloppy on white cock. That’s the look.<</speech>>
<<speech "producer" "Producer">>More drool. Chin shiny.<</speech>>
<<speech "anna" "Anna Foxxx">>You brought the size. I brought the mess.<</speech>>
<<mgButtons "focus" 2 "career/gloryhole/initiation/a5.webm" 1>>
<<elseif $phase == 1>>
<<set $focusScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a6.webm" type="video/webm"></video>
</div>
He starts hitting the back of her throat. She gags on purpose and lets the saliva get worse.
<<speech "producer" "Producer">>Again. We want the gag.<</speech>>
<<speech "anna" "Anna Foxxx">>There. That’s the sound this site pays for.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a7.webm" type="video/webm"></video>
</div>
She turns, teases him with her ass, then grabs his cock and pulls it toward her.
<<speech "producer" "Producer">>Line it up, Anna. Don’t put it in until we see the tease.<</speech>>
<<speech "you">>I can feel how warm you are.<</speech>>
<<speech "anna" "Anna Foxxx">>Newbie’s polite. Cute. Won’t last.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a8.webm" type="video/webm"></video>
</div>
She backs onto him and starts fucking herself through the hole.
<<speech "anna" "Anna Foxxx">>In. God. Thick white cock in a Black pussy through a wall.<</speech>>
<<speech "producer" "Producer">>Bounce. We want the stretch on camera.<</speech>>
<<speech "anna" "Anna Foxxx">>Pushing back because you don’t know how to use it yet. I’ll teach.<</speech>>
/* STAMINA */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a9.webm" type="video/webm"></video>
</div>
$playerName starts moving. She plays with her clit while he hits deep.
<<speech "anna" "Anna Foxxx">>Rookie found the spot by accident. Keep it.<</speech>>
<<speech "producer" "Producer">>Talk to camera while he fucks you.<</speech>>
<<speech "anna" "Anna Foxxx">>Deep white cock and my own fingers. Greedy looks good on me.<</speech>>
<<mgButtons "stamina" 2 "career/gloryhole/initiation/a9.webm" 2>>
<<elseif $phase == 2>>
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a10.webm" type="video/webm"></video>
</div>
Missionary through the hole. She spreads herself so the camera can see every inch.
<<speech "anna" "Anna Foxxx">>Enjoying every inch because that’s the brand. Black girl, white cock, no waste.<</speech>>
<<speech "you">>I’m trying to last. You’re not helping.<</speech>>
<<speech "anna" "Anna Foxxx">>I’m not paid to help you last.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a11.webm" type="video/webm"></video>
</div>
<<speech "anna" "Anna Foxxx">>I can’t believe the new kid is spreading me like a veteran.<</speech>>
<<speech "producer" "Producer">>Play with your clit. Talk size.<</speech>>
<<speech "anna" "Anna Foxxx">>Size is the scene. Dark pussy stretched around white cock. Look.<</speech>>
<<speech "anna" "Anna Foxxx">>Pleasure’s stupid right now. Thick and new is a dangerous mix.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a12.webm" type="video/webm"></video>
</div>
She pulls off when she feels him getting close.
<<speech "anna" "Anna Foxxx">>I’ll aim you. I’ve done this wall before.<</speech>>
<<speech "you">>I was gonna say I think I’m close—yeah.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a13.webm" type="video/webm"></video>
</div>
<<speech "anna" "Anna Foxxx">>Come on my tongue. Come on this pretty Black face. Now.<</speech>>
<<speech "producer" "Producer">>Stroke him. Talk filthy.<</speech>>
<<speech "anna" "Anna Foxxx">>Paint me. Thick white load on dark skin.<</speech>>
<<speech "you">>Okay. Okay I’m there—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a14.webm" type="video/webm"></video>
</div>
He covers her tongue and face. She licks it off her fingers for the camera.
<<speech "anna" "Anna Foxxx">>Warm white cum on a Black mouth. That’s a gloryhole payday.<</speech>>
<<speech "producer" "Producer">>Hold still. Catch it.<</speech>>
<<speech "you">>I’m—fuck—<</speech>>
<<speech "anna" "Anna Foxxx">>Rookie painted me like he meant the booking.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/a15.webm" type="video/webm"></video>
</div>
She licks his balls, kisses them, still covered, smiling.
<<speech "anna" "Anna Foxxx">>That’s a beautiful load for a newbie.<</speech>>
<<speech "producer" "Producer">>Leave the face. We want her walking out marked.<</speech>>
<<speech "anna" "Anna Foxxx">>I’ll walk out marked. Book the kid again.<</speech>>
<<silently>>
<<set $sceneCompleted["ghi_anna"] to true>>
<<set $initiationSameDayLock to true>>
<<set $studioSameDayLock to true>>
<<set $initiationIndex to ($initiationIndex || 0) + 1>>
<<set $actionsLeft -= 1>>
<<set $expGloryhole += 1>>
<<set $actressRelation["anna_foxxx"] to ($actressRelation["anna_foxxx"] || 0) + ($lastScore >= 65 ? 12 : 6)>>
<<set $overallStudioRep += ($lastScore >= 65 ? 6 : 3)>>
<<set $studioRelation["dogfart"] += ($lastScore >= 65 ? 6 : 3)>>
<<set $money += ($lastScore >= 65 ? 240 : 150)>>
<<applyWorkLoad "studio" "neutral">>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 65>>
<div class="result-verdict great">Anna wants the kid booked again.</div>
<<else>>
<div class="result-verdict ok">Usable Initiation take.</div>
<</if>>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Initiation"]]
<<else>>
[[Back to Gloryhole Initiation|Gloryhole Initiation]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Kira Noir – Dogfart</div>
<<if ndef $sceneId or $sceneId !== "ghi_kira" or ndef $phase>>
<<set $sceneId to "ghi_kira">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<<set $sceneId to "ghi_kira">>
<<set $metKiraNoir to true>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b1.webm" type="video/webm"></video>
</div>
Kira sits in the booth like she’s already seen the cut.
<<speech "kira" "Kira Noir">>Gloryhole Initiations. Black girl waits. White boy hides. I know the genre.<</speech>>
<<speech "producer" "Producer">>Keep the wait pretty. We want the first look.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b2.webm" type="video/webm"></video>
</div>
$playerName’s cock enters. She licks the head first — soft, teasing, smiling.
<<speech "kira" "Kira Noir">>Oh. Hi. That’s a nice white cock.<</speech>>
<<speech "producer" "Producer">>Keep the tease.<</speech>>
<<speech "kira" "Kira Noir">>New and thick. Dangerous combo.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b3.webm" type="video/webm"></video>
</div>
She takes him deep immediately, one hand on his balls, and hits the back of her throat with a surprised sound.
<<speech "kira" "Kira Noir">>Deep already—okay. That’s farther than the brief.<</speech>>
<<speech "kira" "Kira Noir">>Balls in my hand so I don’t float off this white cock.<</speech>>
/* FOCUS */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b4.webm" type="video/webm"></video>
</div>
Hands and mouth together. She’s staring at the size like it offends her in the best way.
<<speech "producer" "Producer">>Work it. Talk size to camera.<</speech>>
<<speech "kira" "Kira Noir">>Camera—white cock this thick should come with a warning and a priest.<</speech>>
<<speech "you">>You’re not backing off.<</speech>>
<<speech "kira" "Kira Noir">>I don’t back off. I measure.<</speech>>
<<mgButtons "focus" 2 "career/gloryhole/initiation/b4.webm" 1>>
<<elseif $phase == 1>>
<<set $focusScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b5.webm" type="video/webm"></video>
</div>
She strips, turns, bends, and puts him in.
<<speech "kira" "Kira Noir">>Head’s in—god.<</speech>>
<<speech "you">>Tight. Really tight.<</speech>>
<<speech "kira" "Kira Noir">>Good rookie.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b6.webm" type="video/webm"></video>
</div>
She fucks herself on him and plays with her tits while he pushes back.
<<speech "producer" "Producer">>Hands on those DDs, Kira.<</speech>>
<<speech "you">>I can feel you squeezing when you bounce.<</speech>>
<<speech "kira" "Kira Noir">>Then keep bouncing me. That’s the point.<</speech>>
/* TECHNIQUE */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b7.webm" type="video/webm"></video>
</div>
The pace gets harder. She starts leaking down his shaft.
<<speech "producer" "Producer">>Harder. We want her dripping down that white cock.<</speech>>
<<speech "kira" "Kira Noir">>I’m leaking. That’s not a line.<</speech>>
<<speech "producer" "Producer">>Wet sound up. Good.<</speech>>
<<mgButtons "technique" 2 "career/gloryhole/initiation/b7.webm" 2>>
<<elseif $phase == 2>>
<<set $techScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b8.webm" type="video/webm"></video>
</div>
<<speech "kira" "Kira Noir">>My Black pussy is wrapped around his massive white cock. That’s the still.<</speech>>
<<speech "producer" "Producer">>Full stroke. Stretch her.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b9.webm" type="video/webm"></video>
</div>
She pulls off and puts him between her tits.
<<speech "kira" "Kira Noir">>White shaft in dark tits. That’s a religion on this site.<</speech>>
<<speech "producer" "Producer">>Squeeze, Kira.<</speech>>
<<speech "kira" "Kira Noir">>Good.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b10.webm" type="video/webm"></video>
</div>
<<speech "kira" "Kira Noir">>New white boy between a Black girl’s tits and she’s smiling about it. That’s the clip.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b11.webm" type="video/webm"></video>
</div>
<<speech "kira" "Kira Noir">>You’re close. I want it on this face. Don’t hide in my tits.<</speech>>
<<speech "producer" "Producer">>Hands and balls. Beg now.<</speech>>
<<speech "kira" "Kira Noir">>Cover this Black face in white cum. Paint me.<</speech>>
<<mgButtons "stamina" 2 "career/gloryhole/initiation/b11.webm" 3>>
<<elseif $phase == 3>>
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b12.webm" type="video/webm"></video>
</div>
He finishes across her tits, covering them.
<<speech "you">>I can’t—it's—<</speech>>
<<speech "kira" "Kira Noir">>White on these. That’s a picture.<</speech>>
<<speech "producer" "Producer">>Empty him.<</speech>>
<<speech "kira" "Kira Noir">>There’s more. Good boy.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b13.webm" type="video/webm"></video>
</div>
<<speech "kira" "Kira Noir">>You taste like me and a bad decision. Perfect.<</speech>>
<<speech "producer" "Producer">>Hold the kiss on the head.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/b14.webm" type="video/webm"></video>
</div>
She takes a selfie of the mess, thanks him, kisses the head, and leaves.
<<speech "kira" "Kira Noir">>Selfie. Proof a Black girl walked into Initiations and left marked.<</speech>>
<<speech "producer" "Producer">>Prop with a thank-you. Then she exits.<</speech>>
<<speech "kira" "Kira Noir">>Thanks for the load, new kid. Size did the talking. Site’s gonna love the still. Book him.<</speech>>
<<if $lastScore >= 65>>
<<set $kiraVouchReady to true>>
<</if>>
<<silently>>
<<set $sceneCompleted["ghi_kira"] to true>>
<<set $initiationSameDayLock to true>>
<<set $studioSameDayLock to true>>
<<set $initiationIndex to ($initiationIndex || 0) + 1>>
<<set $actionsLeft -= 1>>
<<set $expGloryhole += 1>>
<<set $actressRelation["kira_noir"] to ($actressRelation["kira_noir"] || 0) + ($lastScore >= 65 ? 14 : 7)>>
<<set $overallStudioRep += ($lastScore >= 65 ? 7 : 3)>>
<<set $studioRelation["dogfart"] += ($lastScore >= 65 ? 7 : 3)>>
<<set $money += ($lastScore >= 65 ? 260 : 160)>>
<<applyWorkLoad "studio" "neutral">>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 65>>
<div class="result-verdict great">Kira told them to book you. Dogfart path warming up.</div>
<<else>>
<div class="result-verdict ok">Kira used you. Usable take.</div>
<</if>>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Initiation"]]
<<else>>
[[Back to Gloryhole Initiation|Gloryhole Initiation]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Scarlit Scandal – Dogfart</div>
<<if ndef $sceneId or $sceneId !== "ghi_scarlit" or ndef $phase>>
<<set $sceneId to "ghi_scarlit">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<<set $sceneId to "ghi_scarlit">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c0.webm" type="video/webm"></video>
</div>
Scarlit is already rubbing over her panties, talking to the booth like it’s a church.
<<speech "producer" "Producer">>Over the fabric, Scarlit. Talk to us.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>I came here for white cock through a wall. I’m not whispering it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c1.webm" type="video/webm"></video>
</div>
She’s naked now, stroking herself and moaning for the mic.
<<speech "scarlit" "Scarlit Scandal">>I’m stroking for a white cock I haven’t seen. That’s faith.<</speech>>
<<speech "producer" "Producer">>Louder. We want the booth thin.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Black girl dripping in a box. That’s the homepage.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c2.webm" type="video/webm"></video>
</div>
Two cocks appear. Player on the right, another actor on the left.
<<speech "producer" "Producer">>Right hole is the new kid. Left is the regular.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Two? New kid’s white cock is the headline. Sorry, left.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c3.webm" type="video/webm"></video>
</div>
On her knees between them, stroking both.
<<speech "producer" "Producer">>Stroke, Scarlit.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Warm in both hands. Right one feels like trouble.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c4.webm" type="video/webm"></video>
</div>
<<speech "scarlit" "Scarlit Scandal">>Okay your cock is not fair. Thick and big is an understatement.<</speech>>
<<speech "you">>You can handle it.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>That’s the assignment.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c5.webm" type="video/webm"></video>
</div>
She blows the other guy easily, then glances back at $playerName.
<<speech "scarlit" "Scarlit Scandal">>He fits. Cute. I’ll be back. Don’t go soft on me, rookie.<</speech>>
/* FOCUS */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c6.webm" type="video/webm"></video>
</div>
Both hands on $playerName. She gags immediately.
<<speech "scarlit" "Scarlit Scandal">>Both hands and I still gag.<</speech>>
<<speech "producer" "Producer">>Hands help. Throat does the work.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Thick white cock vs petite Black throat. Unfair. I’m staying.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>See this. I’m slobbering for you on purpose.<</speech>>
<<mgButtons "focus" 2 "career/gloryhole/initiation/c6.webm" 1>>
<<elseif $phase == 1>>
<<set $focusScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c7.webm" type="video/webm"></video>
</div>
<<speech "producer" "Producer">>Show the slobber. Glance left like he’s smaller.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>This is what the new white cock does to a pretty face. Sheer size. I’m wearing you on my chin.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c8.webm" type="video/webm"></video>
</div>
<<speech "producer" "Producer">>Switch. Keep a hand on the kid.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Addicted already. That’s embarrassing. I’ll allow it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c9.webm" type="video/webm"></video>
</div>
She fucks the other cock while stroking $playerName.
<<speech "producer" "Producer">>Don’t come, kid.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Stay hard for me. Him inside, you in my fist.<</speech>>
/* STAMINA */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c10.webm" type="video/webm"></video>
</div>
She puts $playerName in her pussy and immediately feels the stretch.
<<speech "scarlit" "Scarlit Scandal">>Putting you in—oh. Oh that’s a lot for a little girl.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Stretching already. New white cock doesn’t care about petite.<</speech>>
<<mgButtons "technique" 2 "career/gloryhole/initiation/c10.webm" 2>>
<<elseif $phase == 2>>
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c11.webm" type="video/webm"></video>
</div>
<<speech "scarlit" "Scarlit Scandal">>I’m milking you. Feel that clench, rookie?<</speech>>
<<speech "producer" "Producer">>Bounce and squeeze. Talk.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Black pussy working a thick white cock through a wall. That’s the religion.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c12.webm" type="video/webm"></video>
</div>
<<speech "producer" "Producer">>Faster hand.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Don’t finish in my fist.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c13.webm" type="video/webm"></video>
</div>
The other cock paints her first. She takes it with her mouth open.
<<speech "producer" "Producer">>Wear it.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>Wearing it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c14.webm" type="video/webm"></video>
</div>
<<speech "scarlit" "Scarlit Scandal">>Covered in white and I want the new kid to paint me. Add even more. Please.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c15.webm" type="video/webm"></video>
</div>
<<speech "producer" "Producer">>Beg for the second load.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>More white on this Black face. I can take a second.<</speech>>
<<speech "producer" "Producer">>Harder hand.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c16.webm" type="video/webm"></video>
</div>
<<speech "you">>That’s—all I got—take it—<</speech>>
<<speech "scarlit" "Scarlit Scandal">>That’s it. Keep dripping.<</speech>>
<<speech "producer" "Producer">>Don’t wipe.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/c17.webm" type="video/webm"></video>
</div>
<<speech "scarlit" "Scarlit Scandal">>Completely covered. Thank you, new kid. Thank you, wall.<</speech>>
<<speech "producer" "Producer">>Balls. Soft worship. Talk to camera.<</speech>>
<<speech "scarlit" "Scarlit Scandal">>This white cock is magnificent and he doesn’t even know yet.<</speech>>
<<speech "producer" "Producer">>Kiss what ruined you.<</speech>>
<<silently>>
<<set $sceneCompleted["ghi_scarlit"] to true>>
<<set $initiationSameDayLock to true>>
<<set $studioSameDayLock to true>>
<<set $initiationIndex to ($initiationIndex || 0) + 1>>
<<set $actionsLeft -= 1>>
<<set $expGloryhole += 1>>
<<set $actressRelation["scarlit_scandal"] to ($actressRelation["scarlit_scandal"] || 0) + ($lastScore >= 65 ? 12 : 6)>>
<<set $overallStudioRep += ($lastScore >= 65 ? 6 : 3)>>
<<set $studioRelation["dogfart"] += ($lastScore >= 65 ? 6 : 3)>>
<<set $money += ($lastScore >= 65 ? 250 : 155)>>
<<applyWorkLoad "studio" "neutral">>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 65>>
<div class="result-verdict great">Scarlit made you the headline.</div>
<<else>>
<div class="result-verdict ok">Two-cock take in the can.</div>
<</if>>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Initiation"]]
<<else>>
[[Back to Gloryhole Initiation|Gloryhole Initiation]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Victoria Cakes – Dogfart</div>
<<if ndef $sceneId or $sceneId !== "ghi_victoria" or ndef $phase>>
<<set $sceneId to "ghi_victoria">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<<set $sceneId to "ghi_victoria">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d1.webm" type="video/webm"></video>
</div>
Victoria interviews herself with one hand already working.
<<speech "victoria" "Victoria Cakes">>I came to get fucked through a hole by white cock.<</speech>>
<<speech "victoria" "Victoria Cakes">>I’m impatient and this booth is small for all this ass.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d2.webm" type="video/webm"></video>
</div>
<<speech "producer" "Producer">>Louder. Don’t perform quiet.<</speech>>
<<speech "victoria" "Victoria Cakes">>Then send the dick, producer.<</speech>>
<<speech "producer" "Producer">>Keep talking.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d3.webm" type="video/webm"></video>
</div>
Two cocks appear. Player on the right. She grabs both.
<<speech "victoria" "Victoria Cakes">>Both of you. Fine. I have two hands and no shame.<</speech>>
<<speech "producer" "Producer">>Excited face. We want the jiggle when she leans.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d4.webm" type="video/webm"></video>
</div>
She sucks both, but stays longer on $playerName.
<<speech "victoria" "Victoria Cakes">>White girth vs a Black mouth that came prepared. Almost.<</speech>>
<<speech "producer" "Producer">>Keep switching so we see both.<</speech>>
<<speech "victoria" "Victoria Cakes">>Back and forth but I’m not fair. Thickness stole the clock.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d5.webm" type="video/webm"></video>
</div>
Ass to camera while she sucks $playerName and strokes the other.
<<speech "victoria" "Victoria Cakes">>Camera can have the view. You can have the throat.<</speech>>
<<speech "producer" "Producer">>Hold the pose.<</speech>>
<<speech "victoria" "Victoria Cakes">>White cock in a Black mouth, ass bouncing for the site. That’s a thumbnail.<</speech>>
/* FOCUS */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d6.webm" type="video/webm"></video>
</div>
She locks onto $playerName and deepthroats him, saliva everywhere.
<<speech "victoria" "Victoria Cakes">>Size made you a veteran prop. Congratulations.<</speech>>
<<speech "you">>You’re staring.<</speech>>
<<speech "victoria" "Victoria Cakes">>I’m working. Same thing.<</speech>>
<<mgButtons "focus" 2 "career/gloryhole/initiation/d6.webm" 1>>
<<elseif $phase == 1>>
<<set $focusScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d7.webm" type="video/webm"></video>
</div>
<<speech "victoria" "Victoria Cakes">>Stretch this Black girl with that white cock and don’t be shy.<</speech>>
<<speech "producer" "Producer">>Tits in frame. Filthy talk.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d8.webm" type="video/webm"></video>
</div>
She backs onto the other cock first, twerking, $playerName hard in her face.
<<speech "victoria" "Victoria Cakes">>You’re completely hard in front of me and I’m supposed to focus. Cute.<</speech>>
/* TECHNIQUE */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d9.webm" type="video/webm"></video>
</div>
She switches to $playerName. The stretch is immediate. She twerks on him anyway.
<<speech "victoria" "Victoria Cakes">>This is the one I wanted in the interview.<</speech>>
<<speech "producer" "Producer">>Twerk on the kid. Show the stretch.<</speech>>
<<speech "victoria" "Victoria Cakes">>Black ass working white cock through a hole. Site’s gonna loop it.<</speech>>
<<mgButtons "technique" 2 "career/gloryhole/initiation/d9.webm" 2>>
<<elseif $phase == 2>>
<<set $techScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d10.webm" type="video/webm"></video>
</div>
<<speech "producer" "Producer">>Keep working.<</speech>>
<<speech "victoria" "Victoria Cakes">>Hard work on this thickness. That’s devotion plus cakes.<</speech>>
<<speech "victoria" "Victoria Cakes">>I should take care of him. I can’t. You’re too good for a first-timer.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d11.webm" type="video/webm"></video>
</div>
<<speech "victoria" "Victoria Cakes">>He’s close.<</speech>>
<<speech "producer" "Producer">>Finish the left so she can beg the right. Aim him at that face.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d12.webm" type="video/webm"></video>
</div>
<<speech "victoria" "Victoria Cakes">>That’s one. Warm. Fine. Next.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d13.webm" type="video/webm"></video>
</div>
<<speech "victoria" "Victoria Cakes">>Now you. I want your cum like I didn’t just get painted. Give me what I sat on you for.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d14.webm" type="video/webm"></video>
</div>
<<speech "victoria" "Victoria Cakes">>Please—I want yours. I’m already messy. Make it worse.<</speech>>
<<speech "producer" "Producer">>Beg uglier.<</speech>>
<<speech "victoria" "Victoria Cakes">>White cum on this Black face. I want it dripping off my tongue.<</speech>>
<<mgButtons "stamina" 2 "career/gloryhole/initiation/d14.webm" 3>>
<<elseif $phase == 3>>
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d15.webm" type="video/webm"></video>
</div>
<<speech "victoria" "Victoria Cakes">>Forehead yes. Cover it. Happy. Look.<</speech>>
<<speech "victoria" "Victoria Cakes">>Write it on my skin. You already did.<</speech>>
<<speech "producer" "Producer">>Take the rest.<</speech>>
<<speech "victoria" "Victoria Cakes">>Two strangers, one marked Victoria. New kid wins.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/d16.webm" type="video/webm"></video>
</div>
<<speech "producer" "Producer">>Show the face. Then the tits. Stroke both as a thank-you.<</speech>>
<<speech "victoria" "Victoria Cakes">>Camera. This is after. Breathe with me.<</speech>>
<<silently>>
<<set $sceneCompleted["ghi_victoria"] to true>>
<<set $initiationSameDayLock to true>>
<<set $studioSameDayLock to true>>
<<set $initiationIndex to ($initiationIndex || 0) + 1>>
<<set $actionsLeft -= 1>>
<<set $expGloryhole += 1>>
<<set $actressRelation["victoria_cakes"] to ($actressRelation["victoria_cakes"] || 0) + ($lastScore >= 65 ? 12 : 6)>>
<<set $overallStudioRep += ($lastScore >= 65 ? 6 : 3)>>
<<set $studioRelation["dogfart"] += ($lastScore >= 65 ? 6 : 3)>>
<<set $money += ($lastScore >= 65 ? 250 : 155)>>
<<applyWorkLoad "studio" "neutral">>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 65>>
<div class="result-verdict great">Victoria marked you the winner.</div>
<<else>>
<div class="result-verdict ok">Messy two-cock wrap.</div>
<</if>>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Initiation"]]
<<else>>
[[Back to Gloryhole Initiation|Gloryhole Initiation]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Alexis Tae – Dogfart</div>
<<if ndef $sceneId or $sceneId !== "ghi_alexis" or ndef $phase>>
<<set $sceneId to "ghi_alexis">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<<set $sceneId to "ghi_alexis">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e1.webm" type="video/webm"></video>
</div>
Alexis waits at the hole like she’s hunting. When $playerName appears she smiles and starts playing with him immediately.
<<speech "alexis" "Alexis Tae">>There you are. I was getting curious. Don’t be shy now.<</speech>>
<<speech "producer" "Producer">>First look. Hands on him. Talk size later.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e2.webm" type="video/webm"></video>
</div>
A second cock pokes out beside him. She holds the extra one and stares at $playerName like he just ruined the math.
<<speech "alexis" "Alexis Tae">>Two? Fine. But this one… look at that. That’s the problem I wanted.<</speech>>
<<speech "you">>You’re staring again.<</speech>>
<<speech "alexis" "Alexis Tae">>I’m cataloguing. There’s a difference.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e3.webm" type="video/webm"></video>
</div>
She sucks both, but the spit and effort go to $playerName.
<<speech "alexis" "Alexis Tae">>I have to spit just to fit you. That’s not a complaint. That’s a review.<</speech>>
<<speech "producer" "Producer">>More spit on the kid. Left can wait.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e4.webm" type="video/webm"></video>
</div>
Deepthroat on $playerName, then she peels her clothes off while still stroking him.
<<speech "alexis" "Alexis Tae">>Clothes are in the way of a cock like this. I’m not performing modest today.<</speech>>
/* FOCUS */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e5.webm" type="video/webm"></video>
</div>
She takes him deep while playing with her own pussy.
<<speech "alexis" "Alexis Tae">>I can feel how far you are and I’m still touching myself. That’s the site.<</speech>>
<<speech "producer" "Producer">>Keep the hand on her clit. Camera wants both jobs.<</speech>>
<<speech "you">>You’re dripping on the floor.<</speech>>
<<speech "alexis" "Alexis Tae">>Your fault. Own it.<</speech>>
<<mgButtons "focus" 2 "career/gloryhole/initiation/e5.webm" 1>>
<<elseif $phase == 1>>
<<set $focusScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e6.webm" type="video/webm"></video>
</div>
<<speech "alexis" "Alexis Tae">>Hands and throat and I still want more of you. That’s greedy. I like greedy.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e7.webm" type="video/webm"></video>
</div>
She kisses and licks his balls while stroking, smiling.
<<speech "alexis" "Alexis Tae">>Warm. Heavy. I’m leaking just from this. Don’t get humble.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e8.webm" type="video/webm"></video>
</div>
She gives the other cock a turn, still glancing at $playerName.
<<speech "alexis" "Alexis Tae">>Duty. You’re still the one I’m thinking about.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e9.webm" type="video/webm"></video>
</div>
She lets the other cock fuck her first while she keeps stroking $playerName.
<<speech "alexis" "Alexis Tae">>He can warm me up. You’re the one who’s going to stretch me.<</speech>>
<<speech "producer" "Producer">>Keep a hand on the kid. We want the longing.<</speech>>
/* TECHNIQUE */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e10.webm" type="video/webm"></video>
</div>
She bounces on the other cock while staring at $playerName, then starts stroking him like she’s done waiting.
<<speech "alexis" "Alexis Tae">>I want you in me now. I’ve been polite long enough.<</speech>>
<<mgButtons "technique" 2 "career/gloryhole/initiation/e11.webm" 2>>
<<elseif $phase == 2>>
<<set $techScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e11.webm" type="video/webm"></video>
</div>
She puts $playerName in. The stretch hits immediately. She works her clit while she pushes back.
<<speech "alexis" "Alexis Tae">>That’s past the limit. Good. Keep it there.<</speech>>
<<speech "you">>You’re taking all of it.<</speech>>
<<speech "alexis" "Alexis Tae">>I’m taking what I asked for.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e12.webm" type="video/webm"></video>
</div>
<<speech "alexis" "Alexis Tae">>Deep. I’m grinding because I don’t want you to leave that spot.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e13.webm" type="video/webm"></video>
</div>
She goes back to the other cock with longing eyes on $playerName.
<<speech "alexis" "Alexis Tae">>Don’t go anywhere. I’m finishing him so I can come back to you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e14.webm" type="video/webm"></video>
</div>
<<speech "producer" "Producer">>Make the left finish. Face.<</speech>>
<<speech "alexis" "Alexis Tae">>Come on. Give me the first coat so I can beg for the good one.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e15.webm" type="video/webm"></video>
</div>
<<speech "alexis" "Alexis Tae">>That’s one faceful. Cute. Now the one I actually wanted.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e16.webm" type="video/webm"></video>
</div>
<<speech "alexis" "Alexis Tae">>Your turn. I already know how you taste. I want the rest of it on me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e17.webm" type="video/webm"></video>
</div>
<<speech "alexis" "Alexis Tae">>I can take you down. Watch. And when you’re close, don’t hide it. I want it on this face.<</speech>>
<<speech "you">>I’m close.<</speech>>
<<speech "alexis" "Alexis Tae">>Then give it to me. Don’t be polite now.<</speech>>
<<mgButtons "stamina" 2 "career/gloryhole/initiation/e17.webm" 3>>
<<elseif $phase == 3>>
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e18.webm" type="video/webm"></video>
</div>
He covers her face. She smiles through it and keeps aiming him.
<<speech "alexis" "Alexis Tae">>Yes—cover it. I asked for this. Look at me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/e19.webm" type="video/webm"></video>
</div>
She kisses him clean and shows the camera her mouth and face.
<<speech "alexis" "Alexis Tae">>Camera. This is after a thick white cock decided I was the target. I’m not wiping yet.<</speech>>
<<speech "producer" "Producer">>Hold the mess. That’s the still.<</speech>>
<<silently>>
<<set $sceneCompleted["ghi_alexis"] to true>>
<<set $initiationSameDayLock to true>>
<<set $studioSameDayLock to true>>
<<set $initiationIndex to ($initiationIndex || 0) + 1>>
<<set $actionsLeft -= 1>>
<<set $expGloryhole += 1>>
<<set $actressRelation["alexis_tae"] to ($actressRelation["alexis_tae"] || 0) + ($lastScore >= 65 ? 12 : 6)>>
<<set $overallStudioRep += ($lastScore >= 65 ? 6 : 3)>>
<<set $studioRelation["dogfart"] += ($lastScore >= 65 ? 6 : 3)>>
<<set $money += ($lastScore >= 65 ? 250 : 155)>>
<<applyWorkLoad "studio" "neutral">>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 65>>
<div class="result-verdict great">Alexis made you the one she came back to.</div>
<<else>>
<div class="result-verdict ok">Initiation two-cock wrap.</div>
<</if>>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Initiation"]]
<<else>>
[[Back to Gloryhole Initiation|Gloryhole Initiation]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Cecilia Lion – Dogfart</div>
<<if ndef $sceneId or $sceneId !== "ghi_cecilia" or ndef $phase>>
<<set $sceneId to "ghi_cecilia">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<<set $sceneId to "ghi_cecilia">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h1.webm" type="video/webm"></video>
</div>
Cecilia waits in the booth, already impatient.
<<speech "cecilia" "Cecilia Lion">>Send something through the wall. I’m not here to sit pretty.<</speech>>
<<speech "producer" "Producer">>Warm yourself first. TV’s on for a reason.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h2.webm" type="video/webm"></video>
</div>
She plays with her tits and clit while watching porn on the TV.
<<speech "cecilia" "Cecilia Lion">>They’re showing white cock on the screen and I still don’t have one in my hand. Rude.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h3.webm" type="video/webm"></video>
</div>
<<speech "cecilia" "Cecilia Lion">>I’m fingering myself in a box for strangers. That’s the job. Louder? Fine. I’m ready.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h4.webm" type="video/webm"></video>
</div>
Two white cocks appear. Player on one side. She’s genuinely surprised.
<<speech "cecilia" "Cecilia Lion">>Two white cocks? That’s not a teaser, that’s a problem.<</speech>>
<<speech "producer" "Producer">>Left is the new kid. Start there.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h5.webm" type="video/webm"></video>
</div>
She grabs $playerName and starts sucking hard, gagging on him immediately.
<<speech "cecilia" "Cecilia Lion">>Thick. That’s why I gagged. I’m not sorry.<</speech>>
<<speech "you">>Easy.<</speech>>
<<speech "cecilia" "Cecilia Lion">>No. I came here to work.<</speech>>
/* FOCUS */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h6.webm" type="video/webm"></video>
</div>
Both hands and mouth, pushing deeper, tasting him.
<<speech "cecilia" "Cecilia Lion">>You taste like the reason I said yes to this booking.<</speech>>
<<speech "producer" "Producer">>Deeper. Keep the other one in frame but don’t leave the kid.<</speech>>
<<mgButtons "focus" 2 "career/gloryhole/initiation/h6.webm" 1>>
<<elseif $phase == 1>>
<<set $focusScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h7.webm" type="video/webm"></video>
</div>
The other cock is getting hard. She still won’t let go of $playerName.
<<speech "cecilia" "Cecilia Lion">>He’s waiting. I’m not done with this one. That’s the scene.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h8.webm" type="video/webm"></video>
</div>
She turns, bends, and puts $playerName in her pussy.
<<speech "cecilia" "Cecilia Lion">>In. Stretch. That’s what I wanted from the first lick.<</speech>>
/* STAMINA */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h9.webm" type="video/webm"></video>
</div>
She pushes back hard, spreading herself for the camera.
<<speech "cecilia" "Cecilia Lion">>Look how wide you make me. Don’t you dare get humble now.<</speech>>
<<speech "producer" "Producer">>Spread. We want the stretch.<</speech>>
<<mgButtons "technique" 2 "career/gloryhole/initiation/h9.webm" 2>>
<<elseif $phase == 2>>
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h10.webm" type="video/webm"></video>
</div>
<<speech "cecilia" "Cecilia Lion">>You’re filling me deep and wide. That’s not a line. That’s anatomy.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h11.webm" type="video/webm"></video>
</div>
She tries the other cock, it slips out, and she gets frustrated.
<<speech "cecilia" "Cecilia Lion">>It slipped. Of course it did. I’m going back to the one that stays in.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h12.webm" type="video/webm"></video>
</div>
<<speech "cecilia" "Cecilia Lion">>Hard again. Good. Bounce with me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h13.webm" type="video/webm"></video>
</div>
She cums on him and pulls off shaking.
<<speech "cecilia" "Cecilia Lion">>I just came on a stranger through a wall. That’s the religion.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h14.webm" type="video/webm"></video>
</div>
She sucks him again, tasting herself, begging.
<<speech "cecilia" "Cecilia Lion">>I taste like I already lost. Paint my face anyway. White on me. That’s the still.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h15.webm" type="video/webm"></video>
</div>
He finishes down her throat. It spills over her chest.
<<speech "cecilia" "Cecilia Lion">>Too much. Good. Let it run.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h16.webm" type="video/webm"></video>
</div>
She spits and rubs it over her breasts.
<<speech "producer" "Producer">>Spread it. Tits shiny.<</speech>>
<<speech "cecilia" "Cecilia Lion">>I’m wearing the new kid. Book him before someone else does.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h17.webm" type="video/webm"></video>
</div>
She makes the other cock finish on her tongue and adds it to the mess.
<<speech "cecilia" "Cecilia Lion">>Yours first. His second. Still yours on my chest.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/h18.webm" type="video/webm"></video>
</div>
<<speech "cecilia" "Cecilia Lion">>Camera. White all over a Black chest because two strangers paid the wall. I like this job.<</speech>>
<<silently>>
<<set $sceneCompleted["ghi_cecilia"] to true>>
<<set $initiationSameDayLock to true>>
<<set $studioSameDayLock to true>>
<<set $initiationIndex to ($initiationIndex || 0) + 1>>
<<set $actionsLeft -= 1>>
<<set $expGloryhole += 1>>
<<set $actressRelation["cecilia_lion"] to ($actressRelation["cecilia_lion"] || 0) + ($lastScore >= 65 ? 12 : 6)>>
<<set $overallStudioRep += ($lastScore >= 65 ? 6 : 3)>>
<<set $studioRelation["dogfart"] += ($lastScore >= 65 ? 6 : 3)>>
<<set $money += ($lastScore >= 65 ? 250 : 155)>>
<<applyWorkLoad "studio" "neutral">>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 65>>
<div class="result-verdict great">Cecilia told them to book you.</div>
<<else>>
<div class="result-verdict ok">Messy Initiation wrap.</div>
<</if>>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Initiation"]]
<<else>>
[[Back to Gloryhole Initiation|Gloryhole Initiation]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Daizy Cooper & Noemie Bilas – Dogfart</div>
<<if ndef $sceneId or $sceneId !== "ghi_daizy" or ndef $phase>>
<<set $sceneId to "ghi_daizy">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<<set $sceneId to "ghi_daizy">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g1.webm" type="video/webm"></video>
</div>
Both girls enter the booth for the first time, inspecting the holes, excited and a little lost.
<<speech "daizy" "Daizy Cooper">>So the cock just… appears. That’s the whole magic trick.<</speech>>
<<speech "noemie" "Noemie Bilas">>I want to see it before I believe it.<</speech>>
<<speech "producer" "Producer">>Inspect the wall. Then each other. We want the first-time energy.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g2.webm" type="video/webm"></video>
</div>
They make out. Tops up. Daizy sucks on Noemie’s tits.
<<speech "daizy" "Daizy Cooper">>If the wall’s going to take its time, I’m not waiting empty.<</speech>>
<<speech "noemie" "Noemie Bilas">>Don’t stop. Camera can watch.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g3.webm" type="video/webm"></video>
</div>
Noemie licks Daizy’s pussy and ass. Daizy moans hard.
<<speech "daizy" "Daizy Cooper">>She’s better at this than the briefing.<</speech>>
<<speech "producer" "Producer">>Keep her face in it. We want the sound.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g4.webm" type="video/webm"></video>
</div>
Daizy returns the favor, burying her face in Noemie.
<<speech "noemie" "Noemie Bilas">>Yes—right there. Don’t come up yet.<</speech>>
<<speech "daizy" "Daizy Cooper">>She tastes like why I agreed to Initiations.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g5.webm" type="video/webm"></video>
</div>
While Daizy is licking her, $playerName’s cock enters. Both freeze, then grin.
<<speech "noemie" "Noemie Bilas">>There. That’s the hole working.<</speech>>
<<speech "daizy" "Daizy Cooper">>New kid. Look at the size on that white cock.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g6.webm" type="video/webm"></video>
</div>
They crawl to him together and stroke him, surprised.
<<speech "daizy" "Daizy Cooper">>That’s not a starter cock. That’s a problem we asked for.<</speech>>
<<speech "noemie" "Noemie Bilas">>Warm. Thick. I want it first.<</speech>>
<<speech "you">>There’s enough.<</speech>>
<<speech "daizy" "Daizy Cooper">>We’ll see.<</speech>>
/* FOCUS */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g7.webm" type="video/webm"></video>
</div>
Daizy pushes Noemie onto him, spanking her and playing with her body.
<<speech "daizy" "Daizy Cooper">>Go first. Take that white cock down. I’ll help.<</speech>>
<<speech "noemie" "Noemie Bilas">>It’s a lot—<</speech>>
<<speech "daizy" "Daizy Cooper">>That’s why you’re going first.<</speech>>
<<speech "producer" "Producer">>Push her. We want the assist.<</speech>>
<<mgButtons "focus" 2 "career/gloryhole/initiation/g7.webm" 1>>
<<elseif $phase == 1>>
<<set $focusScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g8.webm" type="video/webm"></video>
</div>
Noemie sucks hard while Daizy plays with her pussy.
<<speech "daizy" "Daizy Cooper">>Look at her take it. That’s my girl.<</speech>>
<<speech "noemie" "Noemie Bilas">>He’s hitting my throat already.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g9.webm" type="video/webm"></video>
</div>
Daizy’s turn. She takes him immediately. Noemie sits and watches, touching herself.
<<speech "daizy" "Daizy Cooper">>My turn. Don’t get shy now that I’m on it.<</speech>>
<<speech "noemie" "Noemie Bilas">>I’m not shy. I’m watching.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g10.webm" type="video/webm"></video>
</div>
<<speech "noemie" "Noemie Bilas">>She’s deepthroating a white cock that thick and I’m dripping. That’s the pair.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g11.webm" type="video/webm"></video>
</div>
Noemie kisses Daizy, then shoves her back onto him.
<<speech "noemie" "Noemie Bilas">>Go hard on her. She asked for this booking.<</speech>>
<<speech "daizy" "Daizy Cooper">>I did. Use me.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g12.webm" type="video/webm"></video>
</div>
Noemie deepthroats him while Daizy stands and masturbates to the gag.
<<speech "daizy" "Daizy Cooper">>That’s it. Gag on that massive white cock. I’m right here.<</speech>>
/* TECHNIQUE */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g13.webm" type="video/webm"></video>
</div>
Daizy grabs Noemie’s head and pushes her deeper while touching herself.
<<speech "daizy" "Daizy Cooper">>Deeper. I want to hear it. That’s turning me on more than the hole did.<</speech>>
<<speech "producer" "Producer">>Hold her there. Then switch to pussy.<</speech>>
<<mgButtons "technique" 2 "career/gloryhole/initiation/g13.webm" 2>>
<<elseif $phase == 2>>
<<set $techScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g14.webm" type="video/webm"></video>
</div>
Daizy fucks him. Noemie guides his cock into her.
<<speech "noemie" "Noemie Bilas">>Easy—there. In.<</speech>>
<<speech "daizy" "Daizy Cooper">>Fuck. That’s the stretch. Don’t you dare pull her hand away.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g15.webm" type="video/webm"></video>
</div>
Before Noemie’s turn she sucks him again, tasting Daizy, deepthroating to lube herself.
<<speech "noemie" "Noemie Bilas">>She tastes good on you. I’m using that.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g16.webm" type="video/webm"></video>
</div>
Daizy helps put him in Noemie. The stretch hits her immediately.
<<speech "noemie" "Noemie Bilas">>I’ve never been opened like this—fuck—<</speech>>
<<speech "daizy" "Daizy Cooper">>Take it. That’s why we’re here.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g17.webm" type="video/webm"></video>
</div>
Noemie fucks him hard, moaning. Daizy encourages her and masturbates.
<<speech "noemie" "Noemie Bilas">>It’s so deep I can’t think—<</speech>>
<<speech "daizy" "Daizy Cooper">>Don’t think. Bounce. I’m watching every inch.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g18.webm" type="video/webm"></video>
</div>
Daizy can’t wait. They both go back to his cock, taking him down their throats.
<<speech "daizy" "Daizy Cooper">>I need that cock too. Share.<</speech>>
<<speech "noemie" "Noemie Bilas">>Then take it. I’m not done tasting him.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g19.webm" type="video/webm"></video>
</div>
They alternate, pushing each other onto him.
<<speech "producer" "Producer">>Push. Switch. We want the fight for it.<</speech>>
<<speech "daizy" "Daizy Cooper">>Make him finish on us. That’s the still.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g20.webm" type="video/webm"></video>
</div>
<<speech "noemie" "Noemie Bilas">>He’s close. I can feel it.<</speech>>
<<speech "daizy" "Daizy Cooper">>Paint both of us. Don’t pick. Cover two Black faces with that white load.<</speech>>
<<speech "you">>I’m there—<</speech>>
<<mgButtons "stamina" 2 "career/gloryhole/initiation/g20.webm" 3>>
<<elseif $phase == 3>>
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g21.webm" type="video/webm"></video>
</div>
Noemie strokes him onto both of their tongues and faces.
<<speech "noemie" "Noemie Bilas">>Yes—on us—<</speech>>
<<speech "daizy" "Daizy Cooper">>That’s it. Wear it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/g22.webm" type="video/webm"></video>
</div>
They thank him, kiss his cock, then make out hard.
<<speech "daizy" "Daizy Cooper">>Thank you, new kid. That’s a first-time wall done right.<</speech>>
<<speech "noemie" "Noemie Bilas">>Book him again. We weren’t finished with each other either.<</speech>>
<<speech "producer" "Producer">>Kiss. Messy. That’s wrap.<</speech>>
<<silently>>
<<set $sceneCompleted["ghi_daizy"] to true>>
<<set $initiationSameDayLock to true>>
<<set $studioSameDayLock to true>>
<<set $initiationIndex to ($initiationIndex || 0) + 1>>
<<set $actionsLeft -= 1>>
<<set $expGloryhole += 1>>
<<set $actressRelation["daizy_cooper"] to ($actressRelation["daizy_cooper"] || 0) + ($lastScore >= 65 ? 8 : 4)>>
<<set $actressRelation["noemie_bilas"] to ($actressRelation["noemie_bilas"] || 0) + ($lastScore >= 65 ? 8 : 4)>>
<<set $overallStudioRep += ($lastScore >= 65 ? 7 : 3)>>
<<set $studioRelation["dogfart"] += ($lastScore >= 65 ? 7 : 3)>>
<<set $money += ($lastScore >= 65 ? 280 : 170)>>
<<applyWorkLoad "studio" "neutral">>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 65>>
<div class="result-verdict great">Both girls asked to book you again.</div>
<<else>>
<div class="result-verdict ok">First-time duo wrap.</div>
<</if>>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Initiation"]]
<<else>>
[[Back to Gloryhole Initiation|Gloryhole Initiation]]
[[City|City]]
<</if>>
<</if>><div class="passage-title">Nia Nacci – Dogfart</div>
<<if ndef $sceneId or $sceneId !== "ghi_nia" or ndef $phase>>
<<set $sceneId to "ghi_nia">>
<<set $phase to 0>>
<<set $mg_Returning to false>>
<</if>>
<<if $phase == 0>>
<<set $sceneId to "ghi_nia">>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f1.webm" type="video/webm"></video>
</div>
Nia drops the sunglasses, sits in the Dogfart booth like she owns the wall, and looks at the hole — not the camera.
<<speech "nia" "Nia Nacci">>Dogfart. Gloryhole floor. The Initiation kid who didn’t choke at Joy Media. Let’s see if that was a fluke.<</speech>>
<<speech "producer" "Producer">>This is her voucher. Don’t waste the open.<</speech>>
<<speech "you">>I’m here.<</speech>>
<<speech "nia" "Nia Nacci">>Good. Stay hard and stay useful. I put my name on this slate.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f2.webm" type="video/webm"></video>
</div>
She licks her fingers and masturbates to the porn on the TV.
<<speech "nia" "Nia Nacci">>I’m warming up for a cock I haven’t measured yet. That’s not nerves. That’s hunger.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f3.webm" type="video/webm"></video>
</div>
She strips and plays with her tits, waiting.
<<speech "nia" "Nia Nacci">>Send him through. I didn’t sit in this booth to look pretty for the TV.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f4.webm" type="video/webm"></video>
</div>
His cock appears. Her mouth is already open.
<<speech "nia" "Nia Nacci">>There you are. Thick already. That’s a first-time problem I like.<</speech>>
<<speech "you">>That bad?<</speech>>
<<speech "nia" "Nia Nacci">>That good. Mouth first. Talk later.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f5.webm" type="video/webm"></video>
</div>
<<speech "nia" "Nia Nacci">>Goes all the way down on the first try. Okay. Noted.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f6.webm" type="video/webm"></video>
</div>
She rubs him on her nipples, then traps him between her tits.
<<speech "nia" "Nia Nacci">>White cock in these tits. That’s the picture this site wanted.<</speech>>
/* FOCUS */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f7.webm" type="video/webm"></video>
</div>
Boobjob, moaning while she works him.
<<speech "nia" "Nia Nacci">>Warm and thick and mine for this hour. Don’t finish early on a first look.<</speech>>
<<speech "producer" "Producer">>Let her work. New kid, first booth with her.<</speech>>
<<mgButtons "technique" 2 "career/gloryhole/initiation/f7.webm" 1>>
<<elseif $phase == 1>>
<<set $focusScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f8.webm" type="video/webm"></video>
</div>
She deepthroats him until her eyes roll.
<<speech "nia" "Nia Nacci">>Down. All the way. That’s how you keep a first booking.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f9.webm" type="video/webm"></video>
</div>
Hands and mouth together, showing off.
<<speech "nia" "Nia Nacci">>Camera. New white cock on my mouth. Watch how I use it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f10.webm" type="video/webm"></video>
</div>
She turns, bends, and puts him in her pussy.
<<speech "nia" "Nia Nacci">>In. Stretch me. First time through this wall — don’t be shy.<</speech>>
/* STAMINA */
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f11.webm" type="video/webm"></video>
</div>
He starts moving. She opens around him.
<<speech "nia" "Nia Nacci">>Wide. That’s it. Don’t be gentle with the girl testing you.<</speech>>
<<speech "you">>You feel even tighter.<</speech>>
<<speech "nia" "Nia Nacci">>Then earn it.<</speech>>
<<mgButtons "stamina" 2 "career/gloryhole/initiation/f11.webm" 2>>
<<elseif $phase == 2>>
<<set $lastScore to $mg_Score>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f12.webm" type="video/webm"></video>
</div>
She clenches, takes him deeper, and cums hard on him.
<<speech "nia" "Nia Nacci">>I’m cumming—don’t you stop—this is why they booked a new kid—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f13.webm" type="video/webm"></video>
</div>
She pulls off and sucks him, tasting herself.
<<speech "nia" "Nia Nacci">>I taste like I was right about you.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f14.webm" type="video/webm"></video>
</div>
Back on his cock, moaning loud.
<<speech "nia" "Nia Nacci">>Again. I want another one. This white cock still hits every button.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f15.webm" type="video/webm"></video>
</div>
She starts losing control and cums again.
<<speech "nia" "Nia Nacci">>I can’t—another—fuck—<</speech>>
<<speech "producer" "Producer">>Stay on him. Let her break.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f16.webm" type="video/webm"></video>
</div>
<<speech "nia" "Nia Nacci">>I love tasting myself on this cock. That’s not professional. I don’t care.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f17.webm" type="video/webm"></video>
</div>
She puts him back in with a bright smile to camera.
<<speech "nia" "Nia Nacci">>Camera. This is the new kid. Watch him ruin me on purpose.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f18.webm" type="video/webm"></video>
</div>
Eyes rolling, tits bouncing, pressing back.
<<speech "nia" "Nia Nacci">>Close again—don’t you dare pull out of this pussy yet—<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f19.webm" type="video/webm"></video>
</div>
She cums so hard she loses her footing.
<<speech "nia" "Nia Nacci">>I can’t stand—your cock just took my legs. That’s a wrap shot.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f20.webm" type="video/webm"></video>
</div>
She feels him getting close and goes back to mouth and hands.
<<speech "nia" "Nia Nacci">>Paint this Black face white. I earned the still.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f21.webm" type="video/webm"></video>
</div>
<<speech "nia" "Nia Nacci">>Come on. Talk to this cock with me. Cover me. Now.<</speech>>
<<speech "you">>Take it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f22.webm" type="video/webm"></video>
</div>
He shoots on her tongue and face. She aims and cleans.
<<speech "nia" "Nia Nacci">>That’s a first-look load. Thick. I’ll remember it.<</speech>>
<div class="video-gallery">
<video autoplay loop muted style="width:100%;max-width:950px;height:auto;border-radius:12px;"><source src="career/gloryhole/initiation/f23.webm" type="video/webm"></video>
</div>
She smiles at the camera, wiping a streak off her eye.
<<if $lastScore >= 65>>
<<speech "nia" "Nia Nacci">>He didn’t disappoint. First slate on my floor and he delivered. I’ll tell them to keep him on the board.<</speech>>
<<set $niaInitiationImpressed to true>>
<<set $niaDogfartHook to true>>
<<else>>
<<speech "nia" "Nia Nacci">>Still a beautiful white cock. Last longer next time if you want this floor remembering your name.<</speech>>
<</if>>
<<speech "producer" "Producer">>That’s a wrap. She looks happy. Good sign.<</speech>>
<<silently>>
<<set $sceneCompleted["ghi_nia"] to true>>
<<set $storyDay11Done to true>>
<<set $visitedDogfart to true>>
<<set $unlockedDogfart to true>>
<<set $initiationSameDayLock to true>>
<<set $studioSameDayLock to true>>
<<set $initiationIndex to ($initiationIndex || 0) + 1>>
<<set $actionsLeft -= 1>>
<<set $expGloryhole += 1>>
<<set $actressRelation["nia_nacci"] to ($actressRelation["nia_nacci"] || 0) + ($lastScore >= 65 ? 14 : 7)>>
<<set $overallStudioRep += ($lastScore >= 65 ? 8 : 4)>>
<<set $studioRelation["dogfart"] += ($lastScore >= 65 ? 8 : 4)>>
<<set $money += ($lastScore >= 65 ? 300 : 180)>>
<<applyWorkLoad "studio" "neutral">>
<<unset $phase>>
<<set $mg_Returning to false>>
<<set $mg_UsePhase to false>>
<</silently>>
<div class="result-card">
<div class="result-kicker">Wrap report</div>
<div class="result-score">$lastScore<span class="pct">%</span></div>
<<if $lastScore >= 65>>
<div class="result-verdict great">Nia is impressed. She’ll remember this booth.</div>
<<else>>
<div class="result-verdict ok">Usable first look. She noticed the early finish.</div>
<</if>>
</div>
<<if $exhaustion >= $exhaustionMax>>
[[Continue|Exhaustion Check][$returnAfterExhaustion to "Gloryhole Initiation"]]
<<else>>
[[Back to Gloryhole Initiation|Gloryhole Initiation]]
[[City|City]]
<</if>>
<</if>>